作用域:

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 = ;
_owner = NULL;
_WaitSet = NULL;
_WaitSetLock = ;
_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

最新文章

  1. 文本框value联动修改
  2. ClientScript.RegisterStartupScript 不起作用
  3. 温故而知新--sql存储过程复习
  4. Uploadify在MVC中使用方法案例(上传单张图片)
  5. SQL语句的Select部分只写必要的列
  6. .Net调用非托管代码数据类型不一致的问题
  7. ssh 登陆指定 验证文件
  8. 【转】linux常用命令全集
  9. CCS使用TIPS
  10. 《转》高级Unix命令
  11. FZU Problem 2169 shadow
  12. OpenStack最新版本Folsom架构解析
  13. 2017TSC世界大脑与科技峰会,多角度深入探讨关于大脑意识
  14. WPF+MVVM学习总结 DataGrid简单案例
  15. js与php的区别
  16. 【Python】动手分析天猫内衣售卖数据,得到你想知道的信息
  17. __init__函数
  18. Linux快速查看某条命令的版本和存放的位置(ls -l `which mvn`)
  19. sourceTree git 空目录从远程仓库克隆代码出现warning: templates not found
  20. 结对作业-WordCount进阶版

热门文章

  1. ios之NSNumber
  2. PLAYGROUND 延时运行
  3. Sass 构建之 7-1模式
  4. iptables(1)工具详解
  5. Django项目部署:使用uwsgi和nginx的方式
  6. 蓝牙学习(4) -- L2CAP
  7. 关于Python解释器
  8. Python9-面对对象2-day23
  9. Python9-模块2-序列化-day20
  10. (转)TDD的iOS开发初步以及Kiwi使用入门