synchronized使用

synnchronized:同步,使不同线程同步执行某一部分,保证某一时刻,只有一个线程能够执行某个代码块或者方法

1、synchronized锁住的对象,其他线程中仍可以正常进行访问,仅在其申请该对象的锁时会造成阻塞

如:synchronized(list){...},当list被锁住时,其余线程仍然可以进行访问,但是当其他线程意图申请list的锁synchronized(list)时,会等待list锁的释放

2.用synchronized修饰的一般方法

用synchronized修饰的方法,看似是锁住了该方法,其实是锁住了对象,即该方法所属的实例化对象。

例如:

class Test{
  private int all = 0;
public synchronized void test() { for(int i = 0; i < 100; i++) { System.out.println("test"+all++); } } public synchronized void test_2() { for(int i = 0; i < 100; i++) { System.out.println("test2"+all++); } } }

若我们实例化了一个Test的对象T,则当两个线程分别对T的test()方法或test_2方法进行调用时,均需要先申请T这个实例化对象的锁,不同线程调用T中方法保证了对T中的属性进行访问及更改时不发生冲突

 

3.用synchronized修饰的静态方法

与synchronized修饰的非静态方法不同,用synchronized修饰的static方法,在运行时不再是锁住实例化对象,而是锁住整个类对象,比如:

class Test{
    private static int all = 0;
    public synchronized static void test() {
        for(int i = 0; i < 100; i++) {
            System.out.println("test"+all++);
        }
    }
    public synchronized static void test_2() {
        for(int i = 0; i < 100; i++) {
            System.out.println("test2"+all++);
        }
    }
}       

当调用test()或test_2()方法时,会先申请Test类对象的锁,锁住Test类的所有实例化对象

 

4.用synchronized锁住ArrayList等集合

当锁住集合后,集合里面的元素并未被锁住,仍然可以申请里面每个元素的锁

 

posted @ 2018-06-21 13:18  always_new  阅读(166)  评论(0编辑  收藏  举报