复习并发编程的基础知识(二)

线程的状态6种状态及生命周期

 1.new 
 2.Runnable(Ready和Running)
 3.Blocked   
 4.Waiting 
 5.Timed_Waiting
 6.Terminated 
复习并发编程的基础知识(二)_第1张图片

 线程同步

同步:一些敏感的数据(比如共享的需要修改的资源)不允许被多个线程同时访问,此时就是用同步访问技术,保证数据在任何同一时刻,最多有一个线程可以访问,以保证数据的完整性。

两种方式:1,同步代码块的方式

注意:使用对象锁的时候一定要保证每个线程竞争的锁锁的是一个对象

class UseSynThread implements Runnable{

    private Object object = new Object();  // 对象锁 

    @Override
    public void run() {
        synchronized (object){
            //同步代码块的方式
            System.out.println("同步代码块的方式...");
        }
    }
}

以下是类锁

public synchronized static void test(){
    System.out.println("类锁");
}
//相当于
public static void test01(){
        synchronized (UseSynThread.class){
            System.out.println("类锁");
        }
    }

                  2,同步方法

class UseSynThread implements Runnable{


    @Override
    public synchronized void run() {   //也是对象锁
        //同步方法的方式
        System.out.println("同步方法的方式...");
    }

//    相当于
//    @Override
//    public void run() {
//        synchronized (this){
//            //同步方法的方式
//            System.out.println("同步代码块的方式...");
//        }
//    }

}

线程死锁

线程死锁的代码:

package cn.tulingxueyuan.xiaoshanshan.base;

public class DeadLock {

    public static void main(String[] args) {
        Thread thread1 = new Thread(new DeadLockThread(true));
        thread1.setName("线程1");
        thread1.start();

        Thread thread2 = new Thread(new DeadLockThread(false));
        thread2.setName("线程2");
        thread2.start();
    }
}

class DeadLockThread implements Runnable{

    private static Object object1 = new Object();

    private static Object object2 = new Object();

    private boolean flag ;

    public DeadLockThread(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        if(flag){
            synchronized (object1){
                System.out.println(Thread.currentThread().getName() + "线程要获取object1锁资源。");
                synchronized(object2){
                    System.out.println(Thread.currentThread().getName() + "线程要获取object2锁资源。");
                }
            }
        }else{
            synchronized (object2){
                System.out.println(Thread.currentThread().getName() + "线程要获取object2锁资源。");
                synchronized(object1){
                    System.out.println(Thread.currentThread().getName() + "线程要获取object1锁资源。");
                }
            }
        }
    }
}

运行结果如下:

复习并发编程的基础知识(二)_第2张图片

 jconsole看一下:
复习并发编程的基础知识(二)_第3张图片

 复习并发编程的基础知识(二)_第4张图片

 释放锁资源

正常情况下,run方法执行结束了就会释放锁

wait()方法也会释放锁

但是sleep()和yield()方法都不会释放锁资源。

你可能感兴趣的:(java,并发编程)