JAVA 并发——synchronized的分析

https://blog.csdn.net/chenssy/article/details/54883355

对于同步方法,锁是当前实例对象。对于同步方法块,锁是Synchonized括号里配置的对象。

对于静态同步方法,锁是当前对象的Class对象。

一、同步方法示例

package Synchronized;

/**
 * @author xiaobu
 * @version JDK1.8.0_171
 * @date on  2018/9/27 13:51
 * @descrption  synchronized关键字 demo
 * 一个成员方法加上synchronized关键字后,实际上就是给这个成员方法加上锁,
 * 具体点就是以这个成员方法所在的对象本身作为对象锁。
 * 如果要对这些线程进行同步,那么这些线程所持有的对象锁应当是共享且唯一的!
 * 但是这只是创建了5个线程实例且每个线程持有自己线程对象的对象锁,
 * 表明这个ThreadTest_01对象在不同的线程里执行同步方法
 */
public class ThreadTest_01 implements Runnable{

    @Override
    public  void run() {
        synchronized (ThreadTest_01.class){

        }
        for(int i = 0 ; i < 3 ; i++){
            System.out.println(Thread.currentThread().getName() + "  run......");
        }
    }

  /*  Thread_0  run......
    Thread_0  run......
    Thread_0  run......
    Thread_1  run......
    Thread_1  run......    
    Thread_1  run......
    Thread_4  run......    运行结果
    Thread_4  run......
    Thread_4  run......
    Thread_3  run......
    Thread_3  run......
    Thread_3  run......
    Thread_2  run......
    Thread_2  run......
    Thread_2  run......*/

    public static void main(String[] args) {
        for(int i = 0 ; i < 5 ; i++){
            new Thread(new ThreadTest_01(),"Thread_" + i).start();
          /*  try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/
        }
    }
}

二、synchronized代码块示例

package Synchronized;

/**
 * @author xiaobu
 * @version JDK1.8.0_171
 * @date on  2018/9/27 14:13
 * @descrption 字符串  在这里synchronized锁住的就是lock这个String对象。
 * java中存在一个字符串池,那么这些线程的lock私有变量实际上指向的是堆内存中的同一个区域,
 * 即存放main函数中的lock变量的区域,所以对象锁是唯一且共享的。线程同步!!
 *
 */
public class ThreadTest_02 extends Thread {

    private String lock;
    private String name;

   public ThreadTest_02(String name,String lock){
       this.name = name;
       this.lock = lock;
   }

    @Override
    public void run() {
        synchronized (lock){
            for(int i=0;i<3;i++){
                System.out.println(name+"   run.......");
            }
        }
    }

   /* ThreadTest0   run.......
    ThreadTest0   run.......
    ThreadTest0   run.......
    ThreadTest1   run.......
    ThreadTest1   run.......
    ThreadTest1   run.......
    ThreadTest4   run.......
    ThreadTest4   run.......       运行结果
    ThreadTest4   run.......
    ThreadTest3   run.......
    ThreadTest3   run.......
    ThreadTest3   run.......
    ThreadTest2   run.......
    ThreadTest2   run.......
    ThreadTest2   run.......*/

    public static void main(String[] args) {
        String lock = "test";
        for(int i=0;i<5;i++){
            new ThreadTest_02("ThreadTest"+i,lock).start();
        }

    }


}

三、同步静态方法

package Synchronized;

/**
 * @author xiaobu
 * @version JDK1.8.0_171
 * @date on  2018/9/27 14:54
 * @descrption static超脱于对象之外,
 * 它属于类级别的 对象锁就是该静态方法所在的类的Class实例。
 * 对象锁是唯一且共享的。线程同步!!
 */
public class ThreadTest_03 extends Thread{

    public synchronized static void test(){
        for(int i = 0 ; i < 3 ; i++){
            System.out.println(Thread.currentThread().getName() + " run......");
        }
    }

    @Override
    public void run() {
        test();
    }

    /*Thread-1 run......
    Thread-1 run......
    Thread-1 run......
    Thread-2 run......
    Thread-2 run......
    Thread-2 run......
    Thread-0 run......
    Thread-0 run......   运行结果
    Thread-0 run......
    Thread-4 run......
    Thread-4 run......
    Thread-4 run......
    Thread-3 run......
    Thread-3 run......
    Thread-3 run......*/

    public static void main(String[] args) {
        for(int i = 0 ; i < 5 ; i++){
            new ThreadTest_03().start();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/tanhongwei1994/article/details/83541941