zoukankan      html  css  js  c++  java
  • synchronized与static synchronized 差异

      1.synchronized与static synchronized 差异
          synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这样的约束了。那么static synchronized恰好就是要控制类的全部实例的訪问了。static synchronized是限制线程同一时候訪问jvm中该类的全部实例同一时候訪问相应的代码快。实际上,在类中某方法或某代码块中有 synchronized,那么在生成一个该类实例后,改类也就有一个监视快,放置线程并发訪问改实例synchronized保护快。而static synchronized则是全部该类的实例公用一个监视快了。也也就是两个的差别了,也就是synchronized相当于 this.synchronized,而
    static synchronized相当于Something.synchronized.
          一个日本作者-结成浩的《java多线程设计模式》有这种一个列子:
          pulbic class Something(){
             public synchronized void isSyncA(){}
             public synchronized void isSyncB(){}
             public static synchronized void cSyncA(){}
             public static synchronized void cSyncB(){}
         }
       那么,增加有Something类的两个实例a与b,那么下列组方法何以被1个以上线程同一时候訪问呢
       a.   x.isSyncA()与x.isSyncB()
       b.   x.isSyncA()与y.isSyncA()
       c.   x.cSyncA()与y.cSyncB()
       d.   x.isSyncA()与Something.cSyncA()
        这里,非常清楚的能够推断:
       a。都是对同一个实例的synchronized域訪问。因此不能被同一时候訪问
       b,是针对不同实例的,因此能够同一时候被訪问
       c。由于是static synchronized。所以不同实例之间仍然会被限制,相当于Something.isSyncA()与   Something.isSyncB()了,因此不能被同一时候訪问。
       那么,第d呢?。书上的 答案是能够被同一时候訪问的,答案理由是synchronzied的是实例方法与synchronzied的类方法因为锁定(lock)不同的原因。


       个人分析也就是synchronized 与static synchronized 相当于两帮派,各自管各自,相互之间就无约束了。能够被同一时候訪问。眼下还不是分清楚java内部设计synchronzied是怎么样实现的。


        结论:A: synchronized static是某个类的范围。synchronized static cSync{}防止多个线程同一时候訪问这个    类中的synchronized static 方法。

    它能够对类的全部对象实例起作用。
      
                   B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程同一时候訪问这个实例中的synchronized 方法。



         2.synchronized方法与synchronized代码快的差别
          synchronized methods(){} 与synchronized(this){}之间没有什么差别。仅仅是
    synchronized methods(){} 便于阅读理解,而synchronized(this){}能够更精确的控制冲突限制訪问区域。有时候表现更高效率。


         3.
    synchronizedkeyword是不能继承的
         这个在http://www.learndiary.com/archives/diaries/2910.htm一文中看到的。我想这一点也是非常值得注意的。继承时子类的覆盖方法必须显示定义成synchronized

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    C语言之逻辑运算符
    iOS:实现图片的无限轮播---之使用第三方库SDCycleScrollView
    Mac 环境下svn服务器的配置
    ld: warning: directory not found for option 去掉警告的方法
    Mac怎么设置wifi热点
    如何获取AppStore软件安装包的路径
    四种卸载Mac软件的方法
    UIAlertController
    uiview关联xib
    OC学习篇之---文件的操作
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4744913.html
Copyright © 2011-2022 走看看