前言

近期研读路神之绝世武学,徜徉于浩瀚无垠知识之海洋,偶有攫取吉光片羽,惶恐未领略其精髓即隐入岁月深处,遂急忙记录一二,顺备来日吹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. 基于appium实现的线性代码引用unittest单元测试框架

    在前段时间,分享了几篇关于appium基础的博文,再加上期间也有讲到unittest测试框架,所以今天就来一个专题,在appium+python实现的线性代码基础上,引入unittest框架,使代码更 ...

  2. 设计模式(二十二)Command模式

    一个类在进行工作时会调用自己或者是其他类的方法,虽然调用结果会反映在对象的状态中,但并不会留下工作的历史记录. 这时,如果我们有一个类,用来表示“请进行这项工作”的“命令”就会方便很多.每一项想做的工 ...

  3. StackView在Android的应用

    StackView是AdapterViewAnimator的子类,它用于显示Adapter提供的一系列View.StackView将会以“堆叠”的方式来显示多个列表项.为了控制StackView现实的 ...

  4. 一分钟带你了解JWT认证!

    目录 一.JWT简介 二.JWT认证和session认证的区别 三.JWT认证流程 四.JWT组成 五.JWT使用场景 一.JWT简介 JSON Web Token(JWT)是一个开放的标准(RFC ...

  5. 关于 mybatis 报invalid comparison: java.util.Arrays$ArrayList and java.lang.String异常

    今天碰到个问题,来记录下,希望可以帮助到大家 贴错误源码: 这是一个根据list集合的查找数据的 sql,在接收list的时候加了判断 list != ‘ ’ “”,引起了集合与Stirng类型的比较 ...

  6. nodejs sql --- 添加事务

    添加事务 let transaction; try { transaction = await this.ctx.model.transaction(); await this.ctx.model.C ...

  7. Nginx专题(1):Nginx之反向代理及配置

    摘要:本文从Nginx的概念出发,分别从反向代理的概念.优势.配置代码3个方面介绍了Nginx的特性之一反向代理. 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第一期-宜信支付结算八方 ...

  8. MinIO 搭建

    MinIO 搭建 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务.它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文 ...

  9. [考试反思]0919csp-s模拟测试47:苦难

    ISOLATION 也不粘上面的了,先管好自己. 附了个近期总分,可以看出什么. 反思一下考试心态: 开场看题目,T1傻逼题不用脑子,T2傻逼板子,T3... 这T3是啥啊?没看懂题目啊?再看一遍.啥 ...

  10. php 全文搜索搜索-讯搜使用

    相信很多朋友遇到过,需要全文搜索的场景,百度了一圈发现了一个xunsearch 首先本地采集了1万篇文章,发现效率还可以. 使用上也很简单,直接上代码 //接收关键词 $xs = new XS('xp ...