1.使用

java中的每一个对象都可以作为synchronized的锁进行代码同步,常见的形式

  • 同步代码块锁是synchronized括号内的对象
  • 普通成员方法上,锁是当前的对象,synchronized(this)
  • 静态方法上,锁是当前类的Class对象

2. 原理

synchronized是通过指定某个对象进行加锁,那么synchronized的锁信息肯定是和对象有关。Java的对象头里的Mark Word字段,默认是存储对象的HashCode。32位虚拟机中Mark Word的存储结构

锁状态 Mark Word中的存储内容 标志位
无锁状态 Hash code,偏向锁0 01
偏向锁 线程ID,偏向锁1 01
轻量级锁 指向栈中锁记录的指针 00
重量级锁 指向互斥量的指针 10

3.锁升级

偏向锁 ==> 轻量级锁 ==> 重量级锁

锁只能升级、不能退化

1.偏向锁

  • 偏向锁加锁:Mark Word中记录了当前获取锁线程ID,这样同一个线程可以多次进入同一个共享代码块而无需加锁。如果是无锁状态,则尝试通过CAS将偏向锁中的线程id修改为当前线程。
  • 偏向锁解锁:需要等到全局安全点(在这个时间点上没有正在执行的字节码)会首先暂停拥有偏向锁的线程,判断锁对象是否处于被活动状态,撤销偏向锁后恢复到未锁定或升级为轻量级锁。

2.轻量级锁

  • 加锁:在栈帧中创建空间(Displaced Mark Word)存储Mark Word中内容,然后尝试使用Cas把Mark word中的指针指向栈帧。成功则获取锁,失败则通过自旋获取锁,自旋失败则升级为重量级锁
  • 解锁:通过CAS把栈帧中的(Displaced Mark Word使用CAS替换回Mark Word,成功则说明在期间没有锁竞争,否则唤醒等待线程(已经升级为重量级锁)

3.锁的优缺点

优点 缺点 适用场景
偏向锁 加锁和解锁不需要额外的消耗,和执行非同步方法比仅存在纳秒级的差距 如果线程间存在锁竞争,会带来额外的锁撤销的消耗 适用于只有一个线程访问同步块场景
轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度 如果始终得不到锁竞争的线程使用自旋会消耗CPU 追求响应时间,锁占用时间很短
重量级锁 线程竞争不使用自旋,不会消耗CPU 线程阻塞,响应时间缓慢 追求吞吐量,锁占用时间较长

4. StringBuilder和StringBuffer

如果你看到别人在非并发环境下使用StringBuffer就说,你这里应该用StringBuilder啊,用StringBuffer明显影响性能。这句话前面半句是没问题的,但是说明显影响性能这个就有点显得不那么专业了。如果你看明白的了synchronized的锁升级就应该知道,在单线程环境下永远是偏向锁,不会升级。因此性能开销可以忽略不计。

  1. As of release JDK 5, this class has been supplemented with an equivalent
  2. class designed for use by a single thread, link StringBuilder. The
  3. StringBuilder class should generally be used in preference to
  4. this one, as it supports all of the same operations but it is faster, as
  5. t performs no synchronization.

5. synchronized + String

  1. public class TTT {
  2. public static void main(String[] args) throws ParseException, InterruptedException {
  3. new MyThread("A").start();
  4. synchronized (new String("B")) {
  5. new MyThread("B").start();
  6. }
  7. new MyThread("A").start();
  8. }
  9.  
  10. public static void synchronizeMethod(String str) throws InterruptedException {
  11. synchronized (str) {
  12. TimeUnit.SECONDS.sleep(2);
  13. System.out.println(str);
  14. }
  15. }
  16.  
  17. static class MyThread extends Thread {
  18. String str;
  19.  
  20. public MyThread(String str) {
  21. this.str = str;
  22. }
  23. @Override
  24. public void run() {
  25. try {
  26. synchronizeMethod(str);
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. }

 你知道上面代码的执行情况吗。如果不明白那说明synchronized使用和String的内存分配情况还有欠缺。

谈一谈synchronized关键词的更多相关文章

  1. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  2. 谈一谈泛型(Generic)

    谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 ​ 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...

  3. 从一张图开始,谈一谈.NET Core和前后端技术的演进之路

    从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...

  4. 谈一谈Elasticsearch的集群部署

      Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...

  5. 谈一谈iOS事件的产生和传递

    谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...

  6. Java多线程系列3 synchronized 关键词

    先来看一个线程安全的例子 ,两个线程对count进行累加,共累加10万次. public class AddTest { public static void main(String[] args) ...

  7. 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别

    介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...

  8. 谈一谈APP版本号问题

    如题:谈一谈APP版本号问题 为什么要谈这个问题,周五晚上11~12点,被微信点名,说APP有错,无效的版本号,商城无法下单.我正在准备收拾东西,周末回老家,结果看到这样问题,菊花一紧.我擦,我刚加的 ...

  9. 谈一谈深度学习之semantic Segmentation

    上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...

  10. 蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统

    ***************************************声明*************************************** 个人在oracle路上的成长记录,当中 ...

随机推荐

  1. spring boot / cloud (五) 自签SSL证书以及HTTPS

    spring boot / cloud (五) 自签SSL证书以及HTTPS 前言 什么是HTTPS? HTTPS(全称:Hyper Text Transfer Protocol over Secur ...

  2. FBI Warning

    FBI Warning... --------------------------- 电影中的片头部分:<正宗的FBI Warning>: ========== 翻译: fbi warni ...

  3. java基础部分细节

    访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权限. 默认的,也称为 default,在同一包内可见,不使用任何修饰符. 私有的,以  ...

  4. Spring4整合quartz2.2.3,quartz动态任务

    Spring4整合quartz2.2.3,quartz动态任务 >>>>>>>>>>>>>>>>> ...

  5. selenium系列------元素定位套路

    selenium定位分为上三门,平三门,下三门, id,name,linktext上三门, class ,css,js平三门, xpath,tag名,复数定位(定位一组然后选index元素).

  6. pip源相关问题

    指定源地址安装: pip install -i http://pypi.douban.com/simple/ packagename pip install -i http://pypi.tuna.t ...

  7. Django1-10-5管理界面中文设置

    先确定一下版本是否更高,低版本设置(settings.py文件): LANGUAGE_CODE = 'zh-CN'TIME_ZONE = 'Asia/Shanghai' 但是新版本就会提示不识别zh- ...

  8. spring事务失效情况分析

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt113 <!--[if !supportLists]-->一.&l ...

  9. 1011. A+B和C (15)

    /*1011. A+B和C (15) 时间限制150 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者HOU, Qiming给定区间[-231, 231]内的3个整数A ...

  10. mysql初学,mysql修改,mysql查找,mysql删除,mysql基本命令

    Mysql 下载地址https://dev.mysql.com/downloads/mysql/ 1.连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYS ...