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的锁升级就应该知道,在单线程环境下永远是偏向锁,不会升级。因此性能开销可以忽略不计。

 As of  release JDK 5, this class has been supplemented with an equivalentclass designed for use by a single thread, link StringBuilder.  TheStringBuilder class should generally be used in preference tothis one, as it supports all of the same operations but it is faster, ast performs no synchronization.

5. synchronized + String

public class TTT {public static void main(String[] args) throws ParseException, InterruptedException {new MyThread("A").start();synchronized (new String("B")) {new MyThread("B").start();}new MyThread("A").start();}public static void synchronizeMethod(String str) throws InterruptedException {synchronized (str) {TimeUnit.SECONDS.sleep(2);System.out.println(str);}}static class MyThread extends Thread {String str;public MyThread(String str) {this.str = str;}@Overridepublic void run() {try {synchronizeMethod(str);} catch (InterruptedException e) {e.printStackTrace();}}}
}

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

转载于:https://www.cnblogs.com/lizo/p/7570740.html

谈一谈synchronized关键词相关推荐

  1. 谈一谈浏览器解析CSS选择器的过程【前端每日一题-6】

    谈一谈浏览器解析CSS选择器的过程? 这是一道发散题,可以根据自己的理解自行解答. 在开始前,我们必须了解一个真相:为什么排版引擎解析 CSS 选择器时一定要从右往左解析? 简单的来说:浏览器从右到左 ...

  2. 有一群200w年薪的朋友是什么感觉?谈一谈入学中国科学院大学的几点感受吧

    我叫阿广,偶尔正经,偶尔逗比,97年生人,在求学期间当过鸡头鸡尾,当过凤尾没当过凤头.大家如果想深入了解我,可以查看本公众号的原创文章. 技术人光有技术走不长久,所以今天不更新技术文章了,也给大家谈一 ...

  3. 【建站系列教程】5、谈一谈网站的静态化

    [建站系列教程]5.谈一谈网站的静态化[进阶] 动态页面?静态页面?伪静态页面? 三个页面有何优缺点? 为什么要让网页静态化 如何网页伪静态化? 写在前面:大家好,我是热爱编程的小泽. [建站系列教程 ...

  4. 谈一谈周公所理解的面试

    因为公司最近招聘的力度很大,所以最近公司的面试很多,加之很多同事项目紧,所以让我参加了一些技术面试.不论是作为面试官还是应聘者,参加工作以来我参与的面试的次数我自己也记不清了,所以在此想从面试官和应聘 ...

  5. 我从阿里面试回来,想和Java程序猿谈一谈

    最近小编看了一篇关于面试的文章,题目是"我从阿里面试回来,想和Java程序员谈一谈",内容不是讲面试前刷题,而是更加聚焦在面试前如何准备,以及工作当中如何学习.感觉总结的很不错,今 ...

  6. 怎么学python-结合学习经历,谈一谈如何学习Python

    结合自己的学习经历,谈一谈如何学习Python吧. 入门阶段 Python其实语言本身已经很接近自然语言了,所以入门其实并不麻烦.如果你是从未接触过编程的萌新,给你推荐一门Udacity CS101, ...

  7. 先查询再插入的存储过程怎么写_谈一谈 InnoDB(1) - 底层存储文件结构

    看技术文章是不是很累呢, 这次来个轻松点的~来谈一谈MySQL最主流的数据库引擎 InnoDB 吧~ 序 老王走进一号会议室, 随手打开了灯, 小张紧随其后 "王哥, 找我来干啥啊" ...

  8. java并发中的Synchronized关键词

    文章目录 为什么要同步 Synchronized关键词 Synchronized Instance Methods Synchronized Static Methods Synchronized B ...

  9. Java程序员谈一谈-----java程序员成长之路

    转载:http://www.banzg.com/archives/679.html?ref=myread 阿里面试回来,想和Java程序员谈一谈 引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力 ...

  10. 谈一谈并查集QAQ(上)

    最近几日理了理学过的很多oi知识...发现不知不觉就有很多的知识忘记了... 在聊聊并查集的时候顺便当作巩固吧.... 什么是并查集呢? ( Union Find Set ) 是一种用于处理分离集合的 ...

最新文章

  1. 线上出现死锁怎么解决?
  2. 怎么看懂别人写的单片机项目代码?
  3. 负载均衡算法-权重随机均衡
  4. Permission denied 故障
  5. e-mobile帐号状态存在异常_个体工商经营户解除异常名录操作步骤(暂执行)
  6. 使用EclEmma 插件 解析jacoco.exec文件
  7. 深入学习SAP UI5框架代码系列之一:UI5 Module的懒加载机制
  8. php 根据输入值读取MySQL_MySQL输入PHP给出的另一个值
  9. Python爬虫教程:验证码的爬取和识别详解
  10. 错误使用 network/train (line 340) Output data size does not match net.outputs{2}.size.
  11. Ubuntu下fcitx安装。(ibus不会用)
  12. addEventListener监听
  13. 计算机网络三种模型(OSI模型、TCP/IP模型、五层通用模型)、各层作用
  14. fastadmin 邮件配置
  15. php页面背景url不显示图片,background-image:url(XXXX.gif)为何不显示背景图片_html/css_WEB-ITnose...
  16. 第七阶段 -- 网页编程基础:【HTML】
  17. 美国国土安全部试图商业化的八种网络安全新技术
  18. 为什么一个手机有两个mac地址?
  19. Android View的elevation属性,CardView始终在布局顶层覆盖其它控件的解决方式;
  20. soap+wsimport的webservice接口客户端实现

热门文章

  1. 创文html5作品,【《创文故事》纪录短片入围作品展播之七】引路人
  2. oracle导出数据dummy,oracle导出表结构1
  3. kafka副本数据同步策略
  4. @PostConstruct注解学习,最详细的分享教程
  5. docker显示镜像的摘要信息
  6. Java技术:SpringBoot实现邮件发送功能
  7. 收集程序员的几幅对联
  8. 【原创】关于ASP.NET WebForm与ASP.NET MVC的比较
  9. 单时隙灵敏度有什么影响_英国大学设计出低价开源单分子显微镜
  10. 最优资产组合步骤_重新设计投资组合网站之前,请按照以下5个步骤进行操作