Java并发编程--synchronized

栏目: Java · 发布时间: 7年前

内容简介:Java并发编程--synchronized

synchronized是 Java 中的关键字,在并发编程中被称为内置锁或者监视器锁。当用它来修饰一个方法或者一个代码块的时候能够保证同一时刻最多只有一个线程执行该段代码。

Java的内置锁相当于一种互斥锁,最多只有一个线程能够持有这种锁,故而由这个锁保护的同步代码块会以原子方式执行,多个线程在执行该代码时就不会相互干扰。

但由于被锁保护的同步块代码是以串行形式来访问的,即多个线程以独占的方式访问对象,而这也导致如果被锁保护的同步代码块的作用范围过大,会导致并发不良。

这里有必要简单讲一下内置锁的实现同步的原理:Java中的每一个对象都可以作为锁,synchronized用的锁其实存在Java对象头里(这也是为什么称其为内置锁的原因)。

而根据synchronized修饰的方法或方法块的不同,其锁的形式也不一。

  • 对于普通同步方法,锁是当前实例对象;
  • 对于静态同步方法,锁是当前类的Class对象;
  • 对于同步方法块,锁是synchronized括号内配置的对象;

以下是一个简单的例子,表示synchronized会根据其修饰对象不同而获取不同的锁。

public class Test {
    
    /**
     * 修饰方法,会对该类的实例进行加锁,该实例的所有synchronized方法都必须
     * 等待当前锁释放后才能访问
     */
    public synchronized void syn1(){
        //TODO
        
    }
    
    /**
     * 同步静态方法,会对类对象上锁,该类的其他实例的synchronized方法必须等当前锁释放后才能访问
     */
    public synchronized static void  syn3() {
        //TODO
    }
    /**
     * 同步指定对象,会对对象上锁,其他使用该对象的synchronized方法必须等当前锁释放后才能访问
     */
    public void  syn4() {
        //obj仅代表要修饰的具体对象名
        synchronized (obj) {
            
        }
    }
    /**
     * 同步指定的类,会对类对象上锁,该类的其他实例的synchronized方法必须等当前锁释放后才能访问
     */
    public void syn5() {
        //ClassName仅代表要修饰的具体类
        synchronized(ClassName.class) {
            //TODO
        }
    }

}

此外,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁(锁嵌套时),所以尽量避免无谓的同步控制。此外,为了并发的性能考虑,在实际使用synchronized关键字时,要注意确定synchronized保护的同步代码块大小合理。

Java并发编程实战(使用synchronized实现同步方法) http://www.linuxidc.com/Linux/2015-07/120168.htm

为什么要重点提一下synchronized这个关键字呢?

  1. 在《Java并发编程实战》中提到,synchronized作为JVM的内置属性,它能执行一些优化,例如对线程封闭的锁对象的锁消除优化,通过增加锁的粒度来消除内置锁的同步,而基于类库的锁来实现这些功能则可能性不大。
  2. 内置锁的性能在Java6中已经有所提升,已经较为接近ReentrantLock。(而在Java5中ReentrantLock中是远远胜出的)
  3. 内置锁结构紧凑,而且危险性较低(ReentrantLock可能忘记调用unlock)

所以当内置锁可以满足需求时,尽可能使用内置锁,而仅当内置锁无法满足需求(如可中断、可定时、可轮询、公平性等)。简单的来讲,当需要对锁的获取和释放有更精确的控制要求时,考虑使用ReentrantLock。

Java并发编程实战 PDF+源码 http://www.linuxidc.com/Linux/2014-09/106561.htm

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-06/144704.htm


以上所述就是小编给大家介绍的《Java并发编程--synchronized》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深度探索C++对象模型(影印版)

深度探索C++对象模型(影印版)

Stanley B. Lippman / 中国电力出版社 / 2003-8-1 / 42.00

本书重点介绍了C++面向对象程序设计的底层机制,包括结构式语意、暂时性对象的生成、封装、继承和虚拟——虚拟函数和虚拟继承。书中向你表明:理解底层实现模型,可以极大地提高你的编码效率。Lippman澄清了那些关于C++系统开销与复杂性的各种错误信息和猜测,指出了其中某些成本和利益交换确实存在。他在书中详述了各种实现模型,指出了它们的发展方向以及促使其发展的根本原因。本书涵盖了C++对象模型的语意暗示......一起来看看 《深度探索C++对象模型(影印版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具