作用域:
1、对象实例内--->People jack = new Jack();
①此作用域内的synchronized锁 ,可以防止多个线程同时访问这个对象的synchronized方法
②并且一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法
③此外,不同对象实例的synchronized方法是不相干预的。也就是说,其它线程可以同时访问此类下的另一个对象实例中的synchronized方法
示例:
2、类--->People jack = new Jack();
①此作用域下,可以防止多个线程同时访问这个类中的synchronized方法。也就是说此种修饰,可以对此类的所有对象实例起作用。
示例:
synchronized锁的宏观实现
synchronized的对象锁,其指针指向的是一个monitor对象(由C++实现)的起始地址。每个对象实例都会有一个 monitor。其中monitor可以与对象一起创建、销毁;亦或者当线程试图获取对象锁时自动生成
monitor是由ObjectMonitor实现(ObjectMonitor.hpp文件,C++实现的)
可以写一个简单的锁的demo,然后看下他们的字节码就会发现monitor的身影
ObjectMonitor() { _count = 0; _owner = NULL; _WaitSet = NULL; _WaitSetLock = 0; _EntryList = NULL; }
①先看一下_owner,它指向持有ObjectMonitor对象的线程。当多个线程同时访问一段同步代码时,会先存放到 _EntryList 集合中,接下来当线程获取到对象的monitor时,就会把_owner变量设置为当前线程。同时count变量+1。如果线程调用wait() 方法,就会释放当前持有的monitor,那么_owner变量就会被置为null,同时_count减1,并且该线程进入 WaitSet集合中,等待下一次被唤醒。
②若当前线程顺利执行完方法,也将释放monitor,重走一遍刚才的内容,也就是_owner变量就会被置为null,同时_count减1,并且该线程进入 WaitSet集合中,等待下一次被唤醒。
细节请见:https://baijiahao.baidu.com/s?id=1612142459503895416&wfr=spider&for=pc