zoukankan      html  css  js  c++  java
  • java synchronized的一些知识

      synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的synchronized块,注意是“类的当前实例”,类的两个不同实例就没这种约束了。

           static synchronized是要控制类的所有实例的访问,static synchronized可以实现对类的多个实例的加锁功能。

          《java多线程设计模式》有这样的一个例子:

    public class Something{
        public synchronized void isSyncA(){}
        public synchronized void isSyncB(){}
        public static synchronized void cSyncA(){} 
        public static synchronized void cSyncB(){} 
    }

      那么,假如有Something的2个实例a和b,下面的那个选项是2个线程可以同时访问呢

    a. x.isSyncA()与x.isSyncB()
    b. x.isSyncA()与y.isSyncB()
    c. x.cSyncA()与y.cSyncB()
    d. x.isSyncA()与Something.cSyncA()

      可以有下面的判断:

      a. 都是对同一个实例的synchronized域访问,是同一个所对象,不能同时访问

      b. 针对的是不同的实例,不同的锁对象,可以同时访问

      c. static synchronized,不同实例仍会被限制,等同于Something.cSyncA()与Something.cSyncB(),不能同时访问

      d. 可以同时访问,synchronized的是实例方法与synchronized的类方法的锁的对象是不同的

      static方法可以被多线程同时访问的,只要没使用static成员变量就是线程安全的,常用于工具类。

           static synchronized无法被多线程同时访问,要注意性能上的问题。

  • 相关阅读:
    使用FormData,进行Ajax请求并上传文件
    oracle视图详解
    Unicode和UTF-8之间的关系
    如何访问tomcat所在服务器的其他盘符的资源。
    React首次渲染过程
    react知识点总结
    WebSocket基础
    gulp 批量添加类名 在一个任务中使用多个文件来源
    Chrome浏览器取消INPUT自动记忆下拉框
    Angular7 Drag and Drop
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/13550992.html
Copyright © 2011-2022 走看看