前言

近期研读路神之绝世武学,徜徉于浩瀚无垠知识之海洋,偶有攫取吉光片羽,惶恐未领略其精髓即隐入岁月深处,遂急忙记录一二,顺备来日吹cow之谈资。本小系列为并发之亲儿子-独臂狂侠synchronized专场。

一、使用场景

synchronized是java中的一个关键字,用于给对象加锁,保证在单机的并发条件下线程安全。原子性和可见性是它保证线程安全的基础功能。一定要注意它锁的是对象,而且它是一个排他的非公平可重入锁。本文先从使用的场景上来展现其作用。

1、用在普通方法中

常用的格式如下所示:

 public static void main(String[] args) {
Object obj = new Object();
synchronized (obj) {
System.out.println("进入锁");
// 逻辑略去
System.out.println("退出锁");
}
}

其中obj就是我们加锁的对象,同一个对象,同一刻只能由一个线程加锁,即同一个对象的多个同步块,只能顺序执行,无法同时并行执行。

2、用在普通方法上

如下所示:

 public synchronized void  lockMethod () {
System.out.println("进入锁");
// 逻辑略去
System.out.println("退出锁");
}

用在普通方法上时,无需指定锁的对象,这种情况下java默认锁的是当前的实例对象。效果类似于1中,小括号里面是this。

3、用在静态方法上

如下所示:

 public synchronized static void  lockMethod () {
System.out.println("进入锁");
// 逻辑略去
System.out.println("退出锁");
}

这种情况下,synchronized锁的是当前的类对象,此时形成全局锁,即在同一个JVM中,用到此方法的地方都是挨个执行此方法。

二、synchronized锁的往事

大家对JUC包中的lock锁应该都有过了解,它是jdk1.5的时候出现的,刚出来时lock锁的性能全方位碾压synchronized锁。但synchronized作为Java的嫡系子孙,JVM的开发者们肯定要不遗余力地扶持它,所以在jdk1.6中针对synchronized做了很多的优化,使其性能跟lock锁相差无几,亲儿子不愧是亲儿子。在jdk1.6中,synchronized会分不同情况对代码的加锁机制做优化,比如分了三种锁:偏向锁、轻量级锁、自旋锁、重量级锁,设置了锁膨胀策略、锁清除机制,还做了批量重偏向、偏向锁批量撤销等实现方式提高同步块执行效率。后面我会用两节对其原理进行介绍。

三、后记

何之谓独臂狂侠,盖因发功之时,仅需单臂一刀(引用一次),无需左手加锁右手放锁,而这一刀之功力,便可覆盖周身八丈,浑然天成,劲气运转之时水泼不进,几近无法可破。

Java并发之synchronized关键字深度解析(一)的更多相关文章

  1. Java并发之synchronized关键字深度解析(二)

    前言 本文继续[Java并发之synchronized关键字深度解析(一)]一文而来,着重介绍synchronized几种锁的特性. 一.对象头结构及锁状态标识 synchronized关键字是如何实 ...

  2. Java并发之synchronized关键字深度解析(三)

    前言 本篇主要介绍一下synchronized的批量重偏向和批量撤销机制,属于深水区,大家提前备好氧气瓶. 上一篇说完synchronized锁的膨胀过程,下面我们再延伸一下synchronized锁 ...

  3. Java并发之synchronized关键字

         上篇文章我们主要介绍了并发的基本思想以及线程的基本知识,通过多线程我们可以实现对计算机资源的充分利用,但是在最后我们也说明了多线程给程序带来的两种典型的问题,针对它们,synchronize ...

  4. Java并发之synchronized关键字和Lock接口

    欢迎点赞阅读,一同学习交流,有疑问请留言 . GitHub上也有开源 JavaHouse,欢迎star 引用 当开发过程中,我们遇到并发问题.怎么解决? 一种解决方式,简单粗暴:上锁.将千军万马都给拦 ...

  5. 并发之synchronized关键字的应用

    并发之synchronized关键字的应用 synchronized关键字理论基础 前两章我们学习了下java内存模型的相关知识, 现在我们来讲讲逢并发必出现的synchronized关键字. 作用 ...

  6. 深入理解Java并发之synchronized实现原理

    深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入 ...

  7. 巨人大哥谈Java中的Synchronized关键字用法

    巨人大哥谈Java中的Synchronized关键字用法 认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就 ...

  8. Java进阶1. Synchronized 关键字

    Java进阶1. Synchronized 关键字 20131025 1.关于synchronized的简介: Synchronized 关键字代表对这个方法加锁,相当于不管那一个线程,运行到这个方法 ...

  9. Java并发之synchronized

    Java多线程同步关键词是常用的多线程同步手段.它可以修饰静态类方法,实例方法,或代码块.修饰static静态方法时是对整个类加锁. 一.实现原理 在JVM中对象内存分三块区域,对象头.实例数据.对齐 ...

随机推荐

  1. python中的可变数据类型和不可变数据类型

    1.不可变数据类型:数值.字符串.元组 不允许变量的值发生变化,如果变量的值变化了,那么就是新建了一个对象:对于相同值的对象,在内存中只有一个对象. 2.可变数据类型:列表.字典 允许变量的值发生变化 ...

  2. JAVA基础知识注意事项

    JAVA核心技术卷一 (第十版) 下面是需要注意的: 只有方法名和参数类型叫做方法的签名, 不同的返回类型值不能作为方法的签名.(4.6.1) 这是域与局部变量的主要不同点. 必须明确地初始化方法中的 ...

  3. 在VMware下进行的Windows2008操作系统虚拟机的安装

    一.VMware虚拟机的安装 首先你需要拥有一款软件VMware,这是一款虚拟机安装软件.Vmware比起Vbox收费较贵,占用资源大,但是拥有大量的资源以及拥有克隆技术,适合新手学习使用,较为专业. ...

  4. 转:linux环境mysql root用户密码重置

    经常设置了mysql的root密码,就忘记掉了,这种事还是经常发生的.转自他人(http://www.osyunwei.com/archives/2014.html),权做笔记.linux环境下,解决 ...

  5. 使用float设置经典的网站前端结构(深入探讨)

    .要是DIV的子元素宽度大于它自己的宽度,不管子元素有没有脱离文档流,子元素会在横向向右溢出. 关于高度:1.要是DIV的高度没有设定,其高度受“没有脱离文档流”的子元素影响.以下是DIV宽度为0的情 ...

  6. [tesseract-ocr]OCR图像识别Ubuntu下环境包安装

    问题: ImportError: libSM.so.6: cannot open shared object file: No such file or directory 解决: sudo apt- ...

  7. [考试反思]1025csp-s模拟测试87:生存

    想起一句话 课上求生存,课下求发展 发展还好说,如何生存? 生存很困难... 没什么可抱怨的.有AK的.高分的也很多. 该说的在<Dust>里说完了,安静会吧. 这场rank43怎么追? ...

  8. NOIP模拟 17

    这次.. 考场刚了T1T2两题的正解 然后T2A了,T1被毒瘤卡常 让skyh得了rank1,QMQ 话说这次考试体(r)验(p)极(yong)佳(jin) 也许是昨晚没玩狼人杀睡的比较好?(现场%苗 ...

  9. 8.5 NOIP 模拟测试 13

    今天的考试说实话T1很简单没A,我是傻X.T2T3难得一批,但是暴力的分还是拿了! 总结一下就是:骗分过样例,暴力出奇迹!只要瞎搞就行了! 话说现在终于不像之前那么傻了,终于知道打暴力了,因为之前暴力 ...

  10. Hibernate中关于Query返回查询结果是类名的问题

    query.list返回的是一个装有类的信息的集合,而不装有数据库信息的集合.如下图 运行结果为:   因为得到的集合是类,所以要将list泛型设为那个类,并且将得到的集合进行.get(x).getx ...