想问下:
synchronized (Test.class)
与
synchronized (this)
还有:
static Integer value = 0;
synchronized (value)
有什么区别?
在java虚拟机中,每个对象和类在逻辑上都是和一个监视器相关联的。
对于对象来说,相关联的监视器保护对象的实例变量。
线程锁中test.class (类锁) 与this(对象锁)
对于类来说,监视器保护类的类变量。
(如果一个对象没有实例变量,或者一个类没有变量,相关联的监视器就什么也不监视。)
为了实现监视器的排他性监视能力,java虚拟机为每一个对象和类都关联一个锁。代表任何时候只允许一个线程拥有的特权。线程访问实例变量或者类变量不需锁。
但是如果线程获取了锁,那么在它释放这个锁之前,就没有其他线程可以获取同样数据的锁了。(锁住一个对象就是获取对象相关联的监视器)
类锁实际上用对象锁来实现。当虚拟机装载一个class文件的时候,它就会创建一个java.lang.Class类的实例。当锁住一个对象的时候,实际上锁住的是那个类的Class对象。
一个线程可以多次对同一个对象上锁。对于每一个对象,java虚拟机维护一个加锁计数器,线程每获得一次该对象,计数器就加1,每释放一次,计数器就减 1,当计数器值为0时,锁就被完全释放了。
简而言之,就是要对一个对象加锁,需要一个锁指向这个对象,锁有计数器,对这个对象进行监控。。。。。基本类型是不可能被指针指着的。。。。。
锁的对象问题,即哪个对象需要同步,只是同步的对象不同:
synchronized(Test.class) :
表示如果两个人在访问这个synchronized块时需要同步;Test.class就是那把锁;
与
synchronized (this) :
表示如果两个人在访问这个synchronized块时需要同步;this就是那把锁(this是在对象中代表当前对象)
还有:
static Integer value = 0;
synchronized (value) :
表示如果两个人在访问这个synchronized块时需要同步;value就是那把锁;
也就说锁不同,其他都是一样的。
就像锁门一样,不同的门锁不一样,有的是大锁,有的是小锁;;锁的块越小越好
synchronized (Test.class) 基于class对象做同步锁
synchronized (this) 基于自己Object 做同步锁
static Integer value = 0;
synchronized (value)
使用 value 做有同步锁
锁匙而已,只是名字不同。
this是指当前对象 只有在同一个对象上进行锁的情况下才好用 而Test.Class是类类 所有由这个类创建的实例都会进行锁
他们锁的范围不同
value那个表示没看懂 我的理解 因为你定义的是static 的 它属于类的 不属于类实例的