zoukankan      html  css  js  c++  java
  • synchronized的一些记录

    1、方法内的私有变量,不存在线程安全问题。非线程安全问题存在于实例变量(全局变量)中

    2、在方法上加synchronized表示,当第一个线程进入时方法加锁(其他方法无法调用)

    3、synchronized取得的锁是对象锁,而不是把一段代码或方法(函数)当作锁,所以哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。

    4.1、A线程先持有Object对象的Lock锁,B线程可以以异步的方式调用Object对象中的非synchronized类型的方法。
    4.2、A线程先持有Object对象的Lock锁,B线程如果在这时调用Object对象中的synchronized类型的方法则需等待,也就是同步。

    5、当使用synchronized时,当一个线程得到一个对象的锁后,该线程再次请求此对象锁时是可以再次得到该对象的锁的。synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的。

    6、可重入锁特性:自己可以再次获取自己的内部锁。比如有一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的。【synchronized是可重入锁】

    7、出现异常的锁,会自动释放该对象锁。

    8、synchronized与static synchronized 的区别:
    synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。【实例对象进行限制】
    static synchronized恰好就是要控制类的所有实例的并发访问,static synchronized是限制多线程中该类的所有实例同时访问jvm中该类所对应的代码块。【类对象进行限制】

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

    a. x.isSyncA()与x.isSyncB()   
    b. x.isSyncA()与y.isSyncA()  
    c. x.cSyncA()与y.cSyncB()  
    d. x.isSyncA()与Something.cSyncA()  
    上述各组方法被多线程同时访问的情况:
    a中都是对实例x进行访问,因此不能同时被访问,会产生阻塞情况
    b中访问的是不同的实例,可以同时访问
    c中虽然访问的不同实例,但是调用的方法是锁定类对象,所以会产生阻塞
    d中可以同时被访问,因为前者使用对象锁,后者使用的是类锁,两者无关

  • 相关阅读:
    2017(秋)软工作业: (2)硬币游戏—— 代码分析与改进
    软工作业(1)课程学习热身
    用户体验分析:以 “师路南通网站” 为例
    用户体验分析: 以 “南通大学教务管理系统微信公众号” 为例
    软件工程第二次作业:硬币游戏—— 代码分析与改进
    自我介绍
    用户体验分析---以师路南通为例
    用户体验分析---七八点照相馆
    硬币游戏—— 代码分析与改进
    About me
  • 原文地址:https://www.cnblogs.com/myna/p/7942053.html
Copyright © 2011-2022 走看看