美文网首页
第四章多线程访问同步方法的7种情况

第四章多线程访问同步方法的7种情况

作者: 西西_20f6 | 来源:发表于2020-07-05 10:53 被阅读0次

    1,两个线程同时访问一个对象的同步方法
    同步(互斥)执行
    2,两个线程访问的是两个对象的同步方法
    可同时执行
    3,两个线程访问的是synchronized的静态方法(需要获得类锁)
    同步执行
    4,同时访问同步方法与非同步方法,一个线程访问同步方法,另一个线程访问非同步方法。
    没啥关系,可同时进行。非同步方法不会因为其他方法加了同步关键字而受到影响。

    5,访问同一个对象的不同的普通同步方法
    同步执行,要获取到同一个对象锁。

    6,同时访问静态synchronized和非静态synchronized方法
    一个线程t1访问静态synchronized,另一个线程t2访问非静态synchronized方法,两者没有影响,可以各自执行。

    7,方法抛出异常后,会释放锁。
    synchronized与Lock interface作比较:
    在Lock 中,即便抛出了异常,如果没有手动释放Lock ,是不会释放的,必须在try{}catch(){}的finally中释放。
    而对于synchronized来说,如果抛出了异常,会自动释放锁。

    二、总结7种情况:
    1, 同一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待Block(对应第1、5种情况)

    2,每个实例都对应有自己的一把锁,不同实例之间互不影响。(例外:锁对象是*.class以及Synchronized修饰的是static方法的时候,所有这个类的对象共用同一把类锁(对应2、3、4、6种情况))

    3,无论是方法正常执行完毕或者方法抛出异常,都会释放锁(对应第7种情况)

    相关文章

      网友评论

          本文标题:第四章多线程访问同步方法的7种情况

          本文链接:https://www.haomeiwen.com/subject/tthdqktx.html