synchronized的对象锁和类锁
很多人都知道synchronized可以用来加锁,但对于synchronized(Object o)里的参数不太了解。
java的每个对象隐含一个内部锁,这个内部锁对不同线程是互斥的。synchronized(object){}的本质就是对{}区域中的代码加上object对象的对象锁,只有获取了object的对象锁才能执行该代码块。
如果有:1
2
3
4
5
6
7
8
9
10
11
12
13
14Object o1 = new Object();
Object o2 = new Object();
synchronized(o1){
//block1
}
synchronized(o1){
//block2
}
synchronized(o2){
//block3
}
当有一个线程1在执行block1时,线程2想要执行block2同样会被阻塞,应为o1的对象锁已经被线程1获取;而此时线程3想执行block3则不受影响。
对于类锁,其实就是Class实例的对象锁。因为一个类只有一个Class对象,所以同一个类的所有对象共享同一个类锁。
还有对于方法锁:1
2
3
4
5
6
7
8
9
10
11
12
13class SynchronizedDemo{
public void synchronized method1() {//TODO}
public void method2() {synchronized1(this){//TODO} }
//method1效果等价于method2
public static void synchronized method3(){//TODO}
public static void method4(){synchronized(SynchronizedDemo.class){//TODO} }
//method3效果等价于method4
}
总结:
大多数情况下同步代码块比同步方法要好,因为一个同步方法被执行完之前,该对象的所有同步方法都会被阻塞,而同步代码块可以通过加不同的对象锁来减少阻塞。