• JAVA学习笔记——并发(二)


    共享受限资源

    多线程访问共享资源的时候,需要注意两个问题:

    1. 多个线程不能同时访问一个资源
    2. 多个线程顺序访问一个资源时,需要保持操作的原子性

    为了保证以上两点,需要用锁,也称为互斥量(mutex)。Java提供了关键字volatile和synchronized,为锁(互斥量)提供了支持。

    volatile

    volatile可以理解为轻量级的synchronized,它保证了共享变量的可见性,即一个线程修改共享变量时,其他线程对这个修改是可以看见的,是能读到这个修改值的。volatile不会引起上下文的切换。
    volatile的具体实现原理可简单地描述为:

    1. 线程A准备修改共享变量x,A将x从内存读入CPU缓存进行修改。
    2. 当修改结束后,将x写回内存。这时其他线程发现了它们本来保存的变量x无效了(通过缓存一致性协议实现),就会从内存重新读取。

    如果变量没有被声明为volatile,那么在上述第2步时,不会马上写回内存,这样会使得其他线程觉得x还是有效的。

    synchronized

    synchronized可用于同步方法和代码段。

    同步普通方法

    当同步的是普通方法时,锁的是当前实例对象。当在这个实例对象上调用了synchronized方法且未释放锁时,调用该实例对象上其他的synchronized方法时会阻塞。

    public class test{
        synchronized void f(){}
        synchronized void g(){}
    }
    

    同步静态方法

    同步代码段

  • 相关阅读:
    2018.12.30【NOIP提高组】模拟赛C组总结
    【NOIP2007提高组】矩阵取数游戏
    【NOIP2007提高组】字符串的展开
    【NOIP2007提高组】统计数字
    2018.12.22【NOIP提高组】模拟B组总结
    【NOIP2013模拟11.5A组】cza的蛋糕(cake)
    CDQ分治总结
    O(2),O(3),Ofast 手动开[吸氧]
    【NOIP2013模拟11.6A组】灵能矩阵(pylon)
    【GDKOI2012模拟02.01】数字
  • 原文地址:https://www.cnblogs.com/season-peng/p/6961616.html
Copyright © 2020-2023  润新知