Java语法细节 - synchronized和volatile

目录

  • 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执行语句的顺序可能会因为自动优化而修改,详情见:该博客

原文地址:https://www.cnblogs.com/seancheer/p/10708290.html

时间: 2024-11-12 14:26:23

Java语法细节 - synchronized和volatile的相关文章

Java中的synchronized、volatile、ReenTrantLock、AtomicXXX

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个

Java再学习——synchronized与volatile

volatile:只保证共享资源的可见性的,任何修改都写在主存,所有线程马上就能看到,适用于新值不依赖于旧值的情形. synchronized:保证可操作的原子性一致性和可见性. volatile和synchronized的区别: volatile仅仅使变量在值发生改变时能尽快地让其他线程知道,并不能保证多线程的执行有序性.而synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住. volatile仅能实现变量的修改可见性但不具备原子特性,而synchronize

Java语法细节 - try_finally和set相关

目录 try-catch-finally的关系 TreeSet和HashSet的实现原理和区别 BigDecimal中的一些坑 当BigDecimal在HashSet/HashMap和TreeSet/TreeMap中使用时 try-catch-finally的关系 ? 在try-block中即使出现了异常,finally也会被执行,需要注意的是,如果在try-block中return的是引用类型,在finally中对该引用类型进行修改,会导致最终的return类型也被修改. try { //即使

java 语言多线程可见性(synchronized 和 volatile 学习)

共享变量可见性实现的原理 java 语言层面支持的可见性实现方式: synchronized volatile 1. synchronized 的两条规定: 1 线程解锁前,必须把共享变量的最新值刷新到主内存中. 2 线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(加锁与解锁需要是同一锁) 线程解锁前对共享变量的修改在下次加锁时对其他线程可见. 2. volatile 实现可见性 深入来说,通过加入内存屏障和禁止重排序优化来实现 的. 对volatil

Java线程(二):线程同步synchronized和volatile

上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程共享的,一个线程改变了其成员变量num值,下一个线程正巧读到了修改后的num,所以会递增输出. 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现.拿上篇博文中的例子来说明,在多个线程之间共享了Count类的

java多线程之内存可见性-synchronized、volatile

1.JMM:Java Memory Model(Java内存模型) 关于synchronized的两条规定: 1.线程解锁前,必须把共享变量的最新值刷新到主内存中 2.线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意:加锁和解锁需要是同一把锁) 注:线程解锁前对共享变量的修改在下次加锁时对其他线程可见 2.线程执行互斥代码的过程: 1.获得互斥锁 2.清空工作内存 3.从主内存拷贝变量的最新副本到工作内存 4.执行代码 5.将更改后的共享变量的值刷

4个点说清楚Java中synchronized和volatile的区别

作者 : Hollis 回顾一下两个关键字:synchronized和volatile 1.Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized.volatile.final.concurren包等. 2.synchronized通过加锁的方式,使得其在需要原子性.可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的.的确,大部分并发控制操作都能使用synchronized来完成. 3.volat

Java语法基础

Java语法基础 1.  关键字 某些单词对编译器有着特殊的含义,并且不能作为标示符使用,全部是小写字母 Java语言关键字 abstract boolean break byte case catch char class try do default continue double else extends assert final finally float for If implement import instanceof int interface long native new g

Java课程:1.Java语法基础

1.编写程序时注意: 大小写敏感,记得区分大小写: 类名首字母大写,多个单词的话每个单词都要首字母大写(可以通过暗F2键来修改类名): 方法名首字母都要小写,多个单词的话,除了第一个字母小写外其他首字母都大写: 源文件名与类名定义相同,存储某个单独的类文件是记得默认用类名作为文件名保存,后缀为.Java文件: 主方法入口:所有的Java 程序由public static void main(String []args)方法开始执行,不加的话程序没法执行.(static的方法调用只能调用静态方法直