前言

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

    LAMP的实现原理 LAMP=Linux+Apache+Mysql+PHP.​#工作原理:浏览器向服务器发送http请求,服务器 (Apache) 接受请求,由于php作为Apache的组件模块也会一 ...

  2. 页面报错常用状态码总结(Http常见状态码)

    作为一个互联网开发人员对于一些服务器返回的HTTP状态的意思都必须是了如指掌的,只有将这些状态码一一弄清楚,工作中遇到的各种问题才能够处理的得心应手.好了,下面就让我们来了解一下比较常见的HTTP状态 ...

  3. go map数据结构和源码详解

    目录 1. 前言 2. go map的数据结构 2.1 核心结体体 2.2 数据结构图 3. go map的常用操作 3.1 创建 3.2 插入或更新 3.3 删除 3.4 查找 3.5 range迭 ...

  4. Type of the default value for 'songs' prop must be a function

    eslint常会出现这样的错误提示,控制台打印:Type of the default value for 'songs' prop must be a function 解决办法有两种如下: 1:写 ...

  5. 我发现了Unity3D的2D Light Renderer, 随后就把它抄了过来

    . 前几个月,偶然在群里看到有人讨论Unity3D光照,于是我又萌生了一个新的目标----把它抄过来! . 众所周知,3D渲染的整个流水线都跟光照密不可分,相关的技术更是数不甚数,而2D游戏的光照通常 ...

  6. Magicodes.IE已支持导出Word、Pdf和Html

    关于Magicodes.IE 导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel.Word.Pdf和Html. GitHub地址:https://github.com/xin-la ...

  7. 不需要怎么修改配置的Mybatis整合Spring要点

    首先对于Mybatis的主配置文件,只需要修改一处地方,将事务交给Spring管理,其它地方可以原封不动. <?xml version="1.0" encoding=&quo ...

  8. Logstash 安装及简单实用(同步MySql数据到Elasticsearch)(Windows)

    Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的.多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件 Windows环境: 1.下载logstas ...

  9. phpStorm //todo 的用途

    用phpstorm看到别人的代码使用了注释//todo,且todo是彩色的 我想这个应该是有点用的吧,于是百度了下,大概是可能由于某些原因,导致部分代码没有写.但又怕忘了, 用//todo就可以做提示 ...

  10. python-nmap使用及案例

    nmap概念及功能 概念 NMap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包. nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行 ...