java 并发编程 synchronized

标签: java 编程 synchronized | 发表时间:2015-03-17 09:02 | 作者:yuxiatongzhi
分享到:
出处:http://www.iteye.com
同步原语--synchronized

synchronized(class)很特别,它会让另一个线程在任何需要获取class做为monitor的地方等待.class与this做为不同的监视器可以同时使用,不存在一个线程获取了class,另一个线程就不能获取该class的一切实例.


[list]
  • ->线程各自获取monitor,不会有等待.
  • synchronized(class)
    synchronized(this)

  • ->如果不同线程监视同一个实例对象,就会等待,如果不同的实例,不会等待.
  • synchronized(this)
    synchronized(this)

  • ->如果不同线程监视同一个实例或者不同的实例对象,都会等待.
  • synchronized(class)
    synchronized(class)

    [/list]

    ===============================================================================

    接着来讨论synchronized用到不同地方对代码产生的影响:

    假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都可以调用它们。

    1. 把synchronized当作函数修饰符时,示例代码如下:

    Public synchronized void methodAAA()
    
    {
    
    //….
    
    }


    这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了

    synchronized关键字的方法。

    上边的示例代码等同于如下代码:

    public void methodAAA()
    
    {
    
    synchronized (this)      // (1)
    
    {
    
           //…..
    
    }
    
    }


    (1)处的this指的是什么呢?它指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱:(

    2.同步块,示例代码如下:

    public void method3(SomeObject so)
    
    {
    
        synchronized(so)
    
        { 
           //….. 
        }
    
    }


    这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:

    class Foo implements Runnable
    
    {
    
            private byte[] lock = new byte[0]; // 特殊的instance变量
    
            Public void methodA() 
            {
    
               synchronized(lock) { //… }
    
            }
    
            //…..
    
    }


    注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。

    3.将synchronized作用于static 函数,示例代码如下:

    Class Foo 
    {
    
        public synchronized static void methodAAA()   // 同步的static 函数 
        { 
            //…. 
        }
    
        public void methodBBB() 
        {
    
           synchronized(Foo.class)   // class literal(类名称字面常量)
    
        } 
    }


       代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

    记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。
    [/list]



    已有 0 人发表留言,猛击->> 这里<<-参与讨论


    ITeye推荐



    相关 [java 编程 synchronized] 推荐:

    java 并发编程 synchronized

    - - Java - 编程语言 - ITeye博客
    同步原语--synchronized. synchronized(class)很特别,它会让另一个线程在任何需要获取class做为monitor的地方等待.class与this做为不同的监视器可以同时使用,不存在一个线程获取了class,另一个线程就不能获取该class的一切实例.. ->线程各自获取monitor,不会有等待..

    [转]java synchronized详解

    - - 小彰
    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.      一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行. 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块.

    [原]Java多线程中的synchronized、volatile和无锁编程

    - - Snowball
    新建状态(New):新创建了一个线程对象. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法. 该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.

    Java多线程之synchronized

    - - CSDN博客推荐文章
    这里通过三个测试类阐述了synchronized应用的不同场景. 首先是最基本的synchronized Method的使用.  * @see 概述:Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor) .  * @see 说明:当synchronized关键字修饰一个方法时,则该方法为同步方法 .

    文章: Java SE1.6中的Synchronized

    - - InfoQ cn
    在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗,而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程.

    Java同步块(Synchronized Blocks)

    - - 并发编程网 - ifeve.com
    原文链接  作者:Jakob Jenkov  译者:李同杰. Java 同步块(synchronized block)用来标记方法或者代码块是同步的. Java同步关键字(synchronzied). Java 同步关键字( synchronized ). Java中的同步块用synchronized标记.

    Java中Synchronized的用法

    - - CSDN博客推荐文章
    synchronized是Java中的关键字,是一种同步锁. 它修饰的对象有以下几种:. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;.

    java-synchronized修饰方法释疑

    - - ITeye博客
    java里面用synchronized修饰方法时:. 对于 同一个对象的来说. 所有synchronized修饰的方法会 相互阻塞(即调用了某一个synchronized修饰的方法,则其余所有synchronized修饰的方法的调用都会阻塞,需要等待获取内置锁). 没有synchronized修饰的方法的则不会阻塞.

    Java synchronized同步方法和同步块总结

    - - 编程语言 - ITeye博客
    今天做了一些实验,把Java synchronized同步方法和同步块总结一下,欢迎拍砖. Java synchronized同步方法和同步块总结:. synchronized method() {...} 锁对象的所有同步方法. 一个进程进入某对象同步方法后,其它线程不能同时访问这个对象中任何一个同步方法.

    Java线程同步中关键字synchronized详述

    - - 编程语言 - ITeye博客
    synchronized关键可以修饰函数、函数内语句. 无论它加上方法还是对象上,它取得的锁都是对象,而不是把一段代码或是函数当作锁. 1,当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一段时间只能有一个线程得到执行,而另一个线程只有等当前线程执行完以后才能执行这块代码.