zoukankan      html  css  js  c++  java
  • Synchronized、volatile与锁

    时间尚早,今天多写一点

    温故知新(三)

    Synchronized与volatile

    Synchronized有以下两个含义:
    一、一次只有一个线程可以执行代码的受保护部分
    二、一个线程更改的数据对于其他线程是可见的

    volatile只适合于控制对基本变量(int、boolean等)的单个实例的访问。当一个变量被声明为volatile,任何对该变量的写操作都会绕过高速缓存,直接写入主内存,而任何对改变量的读取也都绕过高速缓存,直接取自主内存。这表示所有线程在任何时候看到的volatile变量值都相同。

    每个Java对象都有一个相关的锁,同一时间只能有一个线程持有Java锁。当线程进入Synchronized代码块时,线程会阻塞并等待,直到锁可用。当线程处于就绪状态时,并且获得锁后,将执行代码块。当控制退出受保护的代码块,即到达了代码块末尾或者抛出没有在Synchronized块中捕获的异常时,它就会释放该锁。

    Java锁可以保护许多代码块或方法,每次只有一个线程可以持有锁。反之,仅仅因为代码块有锁保护并不表示两个线程不能同时执行该代码块。它只表示如果两个线程正在等待相同的锁,则它们不能同时执行该代码。

    将方法声明成Synchronized,这表示在进入方法主体之前,调用者必须获得锁。对于普通的Synchronized方法,这个锁是一个对象,将针对它调用方法。对于静态的Synchronized方法,这个锁是与Class对象相关的监控器,在该对象中声明了方法。

    使用this引用作为锁(Synchronized(this),块同步),表示该代码块将与这个类中的Synchronized方法使用同一个锁。

    访问基于堆栈的局部变量从来不需要受到保护,因为它们只能被自己所属的线程访问。

  • 相关阅读:
    【深度强化学习】Curriculum-guided Hindsight Experience Replay读后感
    【深度学习】perceptron(感知机)
    【深度学习】基础--NumPy
    【RMAN】一些参数温故知新
    初识Kotlin之函数
    初识Kotlin之变量
    编程和英语一起学,每日一词
    SpringBoot注册Windows服务和启动报错的原因
    从Docker 到Jenkins 到Ansible的部署经验
    IDEA 常用配置
  • 原文地址:https://www.cnblogs.com/siyecho/p/9446564.html
Copyright © 2011-2022 走看看