前言

近期研读路神之绝世武学,徜徉于浩瀚无垠知识之海洋,偶有攫取吉光片羽,惶恐未领略其精髓即隐入岁月深处,遂急忙记录一二,顺备来日吹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. day05整理

    目录 一.上节课回顾 (一)数据类型 (1)数字类型 (2)字符串类型str (3)列表类型list (4)字典类型dict (二)jieba模块 (三)wordcloud模块 二.文本处理 (一)什 ...

  2. GCC常用参数详解

    转载:http://www.cnblogs.com/zhangsir6/articles/2956798.html 简介gcc and g++现在是gnu中最主要和最流行的c & c++编译器 ...

  3. char 、signed char、unsigned char

    看如下代码: char c = -1; signed char sc = -1; unsigned char uc = -1; printf("c=%d, sc=%d, uc=%d, cx= ...

  4. 设计模式C++描述----08.原型(Prototype)模式

    一. 概述 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 换句话说,就是不用重新初始化对象,而是动态地获得对象运行时的状态. 再说明白点,就是要一个拷贝过构造函数类似功能的接 ...

  5. 【Java必修课】HashMap性能很好?问过我EnumMap没

    1 简介 我们知道Map只是一个接口,它有多种实现,Java中最常用的是HashMap了.而本文想讲述的是另一个实现:EnumMap.它是枚举类型的Map,要求它的Key值都必须是枚举型的. 2 创建 ...

  6. Linux 命令行获取天气

    目标: 使用 Linux 命令行显示天气预报. 发行版: 所有 Linux 发行版. 要求: 能连上因特网的 Linux 难度: 容易 约定: # - 需要使用 root 权限来执行指定命令,可以直接 ...

  7. csp-s模拟测试101的T3代码+注释

    因为题目过于大神所以单独拿出来说.而且既然下发std了颓代码貌似也不算可耻233 很难讲啊,所以还是写在代码注释里面吧 因为比较认真的写了不少注释,所以建议缩放到80%观看,或者拿到gedit上 1 ...

  8. CSPS模拟 89

  9. 前端与算法 leetcode 1. 两数之和

    目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[1, 2], [11, 1, 2, 3, 2]的运行结果 执行 ...

  10. MySQL传统点位复制在线转为GTID模式复制

    1.  GTID优缺点 MySQL传统点位复制在5.7版本前是主要的主从复制模式,而随着MySQL5.6版本引入GTID,并且MySQL5.7进行各方面的优化以后,在mySQL5.7(尤其是MySQL ...