一篇文章让你读懂synchronized的原理

    相信熟悉java的同学对synchronized关键字也是非常熟悉了,似乎只要在涉及到线程安全的问题的问题中,加上synchronized关键字就对了!

  比如下面这个我们比较常见的代码,懒汉式单例模式:

public class LazySimpleSinglethon {
    private static LazySimpleSinglethon singlethon = null;

    private LazySimpleSinglethon(){}

    public synchronized tatic LazySimpleSinglethon getInstance(){
        if(singlethon==null){ //如果不加synchronizde会存在线程安全问题
            singlethon = new LazySimpleSinglethon();
        }

        return singlethon;
    }
}

好,问题来了,为什么会有线程安全问题?什么是线程安全问题?《Java Concurrency In Practice》一书的作者Brian Goetz 对“线程安全“有一个比较恰到的定义:“当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。” 看完这一段定义,我们可以理解为,当我们在编写代码的时候不需要考虑线程问题即不加上同步处理,程序的运行结果仍然会是正常的,那我们可以说这是线程安全的。比如上面这段代码,如果我们不加上synchronized关键字,那么在多线程环境下,很有可能会创建多个单例对象,很显然这不是我们想要的,也违背了单例模式的设计原则。

  线程安全问题,说白了就是多个线程在操作共享数据时引发的数据安全问题。

  在java语言中,使用synchronized关键字是我们使用互斥同步的方式(还有其他的方式保证线程安全,日后再聊)来保证线程安全的常用手段,那是不是只要涉及线程安全问题,我们都可以用synchronize来解决呢?使用synchronized关键字会不会对性能有什么影响?使用synchronized关键字的缺陷又在哪里呢?接下来我们就好好的聊一聊,synchronized关键字。

  

  •    synchrozized的用法:
  1. 修饰实例方法,作用于当前实例加锁,进入同步代码块前要获得当前实例的锁。
  2. 修饰静态方法,作用于当前类加锁,进入同步代码前要获得当前类对象的锁。
  3. 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码块前要获得给定对象的锁。

  简单的示例代码:

public class SyncDemo {

    //修饰实例方法
   public synchronized void syncMethod(){ //对象锁

   }

   public void syncCode(){
       //修饰代码块
       synchronized (this){   //  括号表示作用范围  this是对象级别  SyncDemo.class类级别
           //保护存在线程安全的变量
       }
   }
    //修饰静态方法
   public synchronized static void syncStaticMethod(){  //类锁
        //TODO
   }
}

  以上代码表示synchronized关键字的两种作用范围,一种作用于对象,一种作用于类。观察synchronized 的整个语法发现,synchronized(lock)是基于lock 这个对象的生命周期来控制锁粒度的,如果这个对象是类,那么作用范围是类级别,如果是对象,那么作用范围就是对象。显而易见类级别的范围要大于对象级别(类的生命周期>对象的生命周期),锁的级别越小,对程序性能的影响也越小。

  synchronized 关键字经过编译之后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令,这两个字节码都需要- 个reference类型的参数来指明要锁定和解锁的对象。如果Java程序中的synchronized明确指定了对象参数,那就是这个对象的reference ;如果没有明确指定,那就根据synchronized修饰的是实例方法还是类方法,去取对应的对象实例或Class对象来作为锁对象。

原文地址:https://www.cnblogs.com/chalice/p/11265421.html

时间: 2024-08-29 10:57:27

一篇文章让你读懂synchronized的原理的相关文章

一篇文章教你读懂Makefile

makefile很重要      什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefil

一篇文章让你读懂iOS和Android的历史起源

智能手机虽说是移动电话,但我们完全可以将其作为小型化的电脑来思考.这样一来也能够显示出智能手机OS的高性能.我们首先一起来回顾下智能手机OS的历史. OS的黎明期 其实在很早之前就已经有这样的想法,即在像智能手机这样可以便利携带的小型电脑终端上运行OS.大约20年前左右,在美国的拉斯维加斯举办的世界最大的电脑相关产品展示会“COMDEX”上,日本索尼公司开发的当时称之为“MagicjLink”的携带型信息终端吸引了很多的关注(图1).这款终端并不仅仅是一款用来记笔记和日程规划的电子帐本,当时已经

一篇文章让你读懂 OpenStack 的起源、架构和应用

OpenStack 是一个面向 IaaS 层的开源项目,用于实现公有云和私有云的部署及管理.拥有众多大公司的行业背书和数以千计的社区成员, OpenStack 被看作是云计算的未来.目前 OS 基金会里已有500多个企业赞助商,遍布世界170多个国家,其中不乏 HP . Cisco . Dell . IBM 等,值得一提的是 Google 也在2015年加入基金会. 一.关于项目起源 Rackspace (一家美国的云计算厂商)和 NASA (美国国家航空航天局)在2010年共同发起了 Open

一篇文章让你读懂什么是餐饮小程序

小程序火了,餐饮+小程序也火了! 作为连接线下消费场景和线上营销的新工具,小程序出现后,迅速赢得了餐饮商家的青睐.与其说,小程序对餐饮行业"情有独钟":不如说,两者是"情投意合". 20天16次更新,随着微信不断地为小程序赋予新功能,越来越多的餐饮商家渴望拥有自己的小程序. 过去,餐饮企业吸引客流有三宝:"打折促销.媒体.美团". 先说打折促销吧,是会吸到一批对价格敏感的人光顾,可一旦活动停止,生意一夜之间又回到了解放前: 找媒体发布软文,也是很

UI绘制流程,让无数安卓工程师无从下手?一篇文章就教你读懂!

前言 在android当中对于UI体系当中往往我们会在绘制UI的时候碰到各种各样的问题而不知道从何解决, 也有时需要开发更改自定义组件时,需要做自己的调整,或者是实现某个自定义特效时的思路不明确,想要达到去玩转UI的最为基础的部分,就是去全面的深入了解UI的绘制流程.所以接下来带大家去进行全面分析UI整体的绘制体系. 思路:android程序启动-→Activity加载并完成生命周期-→setContentView-→图形绘制 疑惑: 1.Android程序是如何启动,Activity生命周期如

一篇文章带你搞懂DEX文件的结构

DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看,跟着我做.看再多遍不如自己亲自实践一遍来的可靠,别问我为什么知道.泪崩ing..... 首先,我们需要自己构造一个dex文件,因为自己构造的比较简单,分析起来比较容易.等你简单的会了,难的自然也就懂了. 0x00■  构造DEX文件 首先,我们编写一个简单的Java程序,如下: public class HelloWorld { int a = 0; static

一篇文章带你搞懂spring全家桶套餐

spring全家桶里都有哪些食物 上期我们讲了spring和springmvc两个框架的基础知识和学习路线,而这期内容,我们将围绕着spring全家桶展开来讨论. 大家应该都知道,按照出现的顺序,spring全家桶大概包含了spring.springmvc.springboot以及springcloud,从开胃小菜spring到满汉全席springcloud,spring全家桶可谓Java工程师的必备大餐,那么,我们不妨先来看看,spring全家桶是如何从光杆司令spring发展到如今的庞大家族

一篇文章带你看懂Cloudflare信息泄露事件

版权声明:本文由贺嘉  原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/753847001488039974 来源:腾云阁 https://www.qcloud.com/community 1.问题描述 近期根据Hacker News的报道,以及国际CDN厂商cloudflare的公告,我们注意到了一起敏感信息.API 密钥被Cloudflare泄露给了随机的 requesters请求,同时相关敏感数据也被搜索引擎给收录

一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora

本文由云+社区发表 | 本文作者: 刘峰,腾讯云NewSQL数据库产品负责人.曾职于联想研究院,Teradata北京研发中心,从事数据库相关工作8年.2017年加入腾讯数据库产品中心,担任NewSQL数据库产品负责人. 云数据库与传统数据库的战争已打响,一个字概括就是"抢". 如火如茶的 AWS re:Invent 2018大会闭幕了,相信云养鹅的产品经理们又准时打开油管,Recap一年一度的科技盛宴. 据说今年一共发布了140多项产品服务,但是,Amazon Aurora 数据库 仍