1. synchronized同步锁的原理

当我们调用某对象的synchronized方法或代码块时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。
不同线程对同步锁的访问是互斥的。也就是说某一时刻,对象的同步锁只能被一个线程获取到。通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程A获取到“obj的同步锁”并在执行一些操作;而此时,线程B也企图获取“obj的同步锁” —— 线程B会获取失败,它必须等待,直到线程A释放了“该对象的同步锁”之后线程B才能获取到“obj的同步锁”从而才可以运行。

2. 使用同步锁三规则

第一条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。
第二条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块。
第三条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的其他的“synchronized方法”或者“synchronized代码块”的访问将被阻塞。

综上所述:synchronized(obj)是对实例obj上的所有synchronized资源上了锁,而对实例的非synchronized资源未上锁。

3. 实例锁和全局锁

实例锁 -- 同一实例上的同步锁,在某一时刻只能由一个线程能访问,其它线程要访问该锁只能同步等待,直到当前线程使用完该锁并释放锁资源。如果该类是单例类,那么该锁也具有全局锁的概念。实例锁对应的就是synchronized关键字。

全局锁 -- 线程对该类的所有对象上锁资源访问均是互斥的,无论实例多少个对象,那么线程都共享该锁。全局锁对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。

有关同步锁的详解参考博文:Java多线程系列--“基础篇”04之 synchronized关键字

 

最新文章

  1. Xshell5连接虚拟机出现连Could not connect to '192.168.47.128' (port 22): Connection failed,解决办法
  2. 关于NK3C使用富文本编辑器(CKEditor)发送HTML邮件的使用说明
  3. Webstorm官方最新版本for Mac版本 不用注册码/破坏原文件
  4. bzoj4400: tjoi2012 桥
  5. Linux系统排查3——I/O篇
  6. 十天学会单片机Day3 D/A与A/D转换器
  7. Google maps API开发(二)(转)
  8. MySQL开发中常用的查询语句总结
  9. ABAP 7.4 新语法-内嵌生命和内表操作
  10. Android框架式编程之RxJava(一):HelloWorld
  11. Linux程序宕掉后如何通过gdb查看出错信息
  12. MFC 不同窗体之间变量调用
  13. Python基础-day01
  14. SpringBoot整合Email(电子邮件服务)
  15. Java 多线程实现
  16. IIS7.5配置Asp.net项目出现HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。
  17. 51nod 1179 最大的最大公约数 一种筛选的方法
  18. HDFS 的运行机制
  19. Unity3D for VR 学习(8): Unity Shader概述
  20. SDUT3146:Integer division 2(整数划分区间dp)

热门文章

  1. sed 删除指定行
  2. typescript学习笔记(三)---接口
  3. Jquery | 基础 | 事件的链式写法
  4. [译]Understanding ECMAScript 6 内容目录
  5. Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理
  6. git代理设置方法
  7. CF1072B Curiosity Has No Limits
  8. 初探ant design pro
  9. 关于js对象中的,属性的增删改查问题
  10. /etc/default/useradd