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等集合
当锁住集合后,集合里面的元素并未被锁住,仍然可以申请里面每个元素的锁