一、Synchronized锁用法示例:
synchronized用处是什么?
synchronized保证了线程的原子性。(一个线程在执行被保护的代码块时,没有任何线程会同时访问)
synchronized还保证了可见性。(当执行完synchronized之后,修改后的变量对其他的线程是可见的)
Java中的synchronized,通过使用内置锁,来实现对变量的同步操作,进而实现了对变量操作的原子性和其他线程对变量的可见性,从而确保了并发情况下的线程安全。
1)加在方法上:
非静态方法:public synchronized void test(){...}
静态方法: public static synchronized void test2(){...}
2)加在代码锁
类锁
public void test(){
...
synchronized (ObjLockTest.class){
...
}
...
}
对象锁
public void test2(){
...
synchronized (this){
...
}
...
}
对象所
public void test3(){
...
A a = new A();
synchronized (a){
...
}
...
}
二、Synchronized锁从被拥有者角度而言,分为对象锁与类锁;
1)Synchronized修饰非静态方法,或非静态方法中的代码块,或指定对象时,锁为对象锁;对象锁是属于当前对象的;
2)Synchronized修饰静态方法,或静态方法中的代码块,或指定对象为XXX.class时,锁为类锁;类锁是属于class的,是这个类的所有对象及class共用的一把锁;
一个对象只有一把对象锁及一把类锁:
即
1)多个线程都需要同一对象的对象锁时(注:可能是调用同一个方法,也可能是调用不同的方法来获取锁),只有一个线程能拿到锁,其他线程都需等待;
2)多个线程都需要多个对象的类锁时(注:可能是调用同一个方法,也可能是调用不同的方法来获取锁),只有一个线程能拿到锁,其他线程都需等待;
3)而2个线程,一个需要对象锁,一个需要类锁时,即使同时发生也不会相互影响(注:此结论本人通过代码测试证明是2个锁,不互斥的);