synchronized是java中并发编程最重要的关键字之一。如果没搞清楚synchronized锁的是什么,可能导致用了没效果,没控制住并发访问
synchronized常用的方式有以下四种
public class SyncTest{
public
synchronized void methodA(){
}
public void methodB(){
synchronized(this){
}
}
public void methodC(){
synchronized(xxx.class){
}
}
public
static synchronized methodD(){
}
}
前两种锁的是
实例对象,即对象锁,后两种锁的是
类对象,即类锁(类锁只是个概念,因为本质锁的本质还是对象)
结论:
1.持有的是同一个实例,是能够达到锁住资源,不让别的线程进入的目的的。就算访问的不是相同的代码块,也会等待。两个线程持有的是
同一个syncTest对象,一个执行syncTest.methodA(),另一个执行syncTest.methodB(),也会有锁的效果。
2.但是如果大家都是
new SyncTest()的话,即使访问同一段代码,是
锁不住的!!!!!!!因为大家所持的实例对象不一样!!!!
3.后两种的话,无论是用类直接调用,还是实例调用,无论是否同一个实例,都会互斥。
4.对象锁和类锁,相互不影响