Java语法细节 - synchronized和volatile

Posted 那个人样子好怪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java语法细节 - synchronized和volatile相关的知识,希望对你有一定的参考价值。

synchronized关键字

synchronized关键字锁住方法和this的不同之处:

public synchronized void MyMethod() {
        /**
         * 1   注意,如果synchronized的是TestClass.class,那么任何new出来的该类的实例都会被阻塞,该方法对于该类的所有实例都是一个临界区
         * 2   如果synchronized的是this,那么只是针对于一个类的具体实例来说,并不是所有的
         * 3   如果在方法命名处,即:public synchronized void MyMethod(),那么等效于2
         */
        //synchronized (this) {
        try {
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //}
    }

关键字volatile

? 注意,对于volatile,Java只保证访问该变量的时候,访问的是最新的(即直接访问的内存,而不是拷贝),但是并不保证原子性,但是其也有可能出现脏数据,因为如果使用value++或者value += 1的操作(这些操作均依赖于volatile变量的上一次的值,因为这些操作都不是原子操作),有可能会出现脏数据volatile的另外一个作用是禁止指令的重排序优化。在一般情况下,Java执行语句的顺序可能会因为自动优化而修改,详情见:该博客

以上是关于Java语法细节 - synchronized和volatile的主要内容,如果未能解决你的问题,请参考以下文章

架构师养成记--3.synchronized细节问题

5.并发编程-synchronized 细节说明

java面试题lock和synchronized有什么区别?

使用JavaScript变量需要注意哪些语法细节?

初学Java多线程:使用Synchronized块同步方法

Java语法细节 - try_finally和set相关