volatile关键字修饰的的同步语法,并与synchronized对比
谈及synchronized,那么必然会涉及到一个另外一个关键字,那就是volatile关键字,接下来开始分析volatile关键字,进一步加深对线程同步问题的研究
volatile关键字作用:
使变量在值发生改变时能尽快地让其他线程知道,即首先我们要先意识到有这样的现象,编译器为了加快程序运行的速度,对一些变量的写操作会先在寄存器或者是CPU缓存上进行,最后才写入内存.而在这个过程,变量的新值对其他线程是不可见的.而volatile的作用就是使它修饰的变量的读写操作都必须在内存中进行!
volatile关键字的产生背景:
在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。
volatile关键字作用:
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
由此我们可以总结出synchronized和volatile关键字的区别
1、volatile本质实在告诉jvm当前变量在寄存器中值是不确定的,需要从主存中读取,而synchronized则只是锁定当前的变量,只有当前的线程可以访问变量,其他的线程被阻塞住
2、volatile仅能使用在变量级别,synchronized则可以使用在变量和方法中
3、volatile仅能实现变量的修改可见性,但不具备原子性,而synchronized则可以保证变量的修改可见性和原子性
4、volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞
5、volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化
分享到:
相关推荐
语法形式为`synchronized(object){ // 需要同步的代码 }`,object是监视器对象,每个对象都有一个与之关联的内置锁。 3. **同步方法**:将synchronized应用于方法,整个方法的执行都会被锁定。这样可以避免整个类的...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以避免数据不一致和竞态条件。在这个问题中,我们将深入理解`synchronized`的关键字用法,包括同步方法和同步块。 1. **...
1. **线程安全**:理解什么是线程安全,如何识别非线程安全的代码,并知道如何使用synchronized关键字、volatile变量、Atomic类等工具来确保线程安全。 2. **死锁**:了解死锁的概念,如何避免死锁,以及如何使用...
- **基本语法**:synchronized可以修饰方法或者代码块。 - 修饰方法:所有调用该方法的线程都必须获取该对象的锁。 - 修饰代码块:指定一个对象作为锁,只有获得锁的线程才能执行代码块内的语句。 - **锁的升级与...
- **用途**:与`try`语句结合使用,用于捕获并处理异常。 8. **char** - **用途**:16位Unicode字符数据类型,用于存储单个字符。 9. **class** - **用途**:定义类的关键字,类是Java的基本单元,用于封装...
通过系统地学习以上知识点,考生可以全面掌握 Java SE 7 的基础知识与高级特性,并能够顺利通过 Oracle Certified Associate (OCA) Java SE 7 Programmer I 认证考试。这不仅有助于提升个人的技术能力,也为进一步...
- **同步机制**:synchronized关键字、volatile关键字、Lock接口及其实现类,以及死锁、活锁、饥饿状态的理解。 - **线程池**:ExecutorService、ThreadPoolExecutor和Executors的使用。 5. **异常处理**: - **...
- 线程同步机制:synchronized关键字、volatile、Lock接口(如ReentrantLock)。 - 死锁的概念及避免死锁的方法。 - 线程池的使用,如ThreadPoolExecutor的参数含义及工作流程。 5. **JVM**: - 堆内存、栈内存...
- **同步机制**:synchronized关键字, volatile关键字,以及Lock接口的使用。 - **并发容器**:如ConcurrentHashMap,ConcurrentLinkedQueue等,了解其并发安全的实现。 5. **IO流与NIO** - **IO流**:了解字节...
- **synchronized**:同步关键字的用法,包括方法同步和代码块同步。 - **volatile**:理解其在多线程中的作用,确保可见性和有序性。 5. **内存管理**: - **垃圾回收**:理解垃圾回收的基本原理,如何触发GC,...
- 同步机制:synchronized关键字,wait()、notify()和notifyAll()方法。 - volatile关键字:理解其在多线程中的作用。 7. **IO流**: - 字节流和字符流:区别和应用场景。 - 流的流向:输入流和输出流。 - ...
- synchronized关键字:实现线程安全。 - volatile关键字:确保可见性和禁止指令重排序。 - **并发工具类**: - Executor框架:管理线程池。 - Lock接口:实现更灵活的锁机制。 #### 八、Java I/O流 - **文件...
- 线程同步和通信是确保多线程安全的关键,常用工具如synchronized关键字、wait/notify机制、ReentrantLock等。 5. **异常处理**: - 异常处理有助于程序在遇到错误时优雅地恢复,避免程序崩溃。异常分为检查异常...
- 线程同步:掌握synchronized关键字,死锁、活锁的概念,以及wait()、notify()和notifyAll()的使用。 - 线程池:了解ExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor的用法。 - volatile...
3. **Java多线程与并发编程**:多线程是Java的一大优势,面试中会考察线程的创建、同步机制(synchronized、Locks)、线程池(ExecutorService)、并发工具类(如Semaphore、CyclicBarrier)等。理解线程安全问题及...
3. 线程同步:synchronized关键字、wait()、notify()、notifyAll()。 4. volatile关键字:保证可见性和有序性。 5. Lock接口:ReentrantLock、ReentrantReadWriteLock。 七、IO流与NIO 1. 流的分类:字节流和字符...
- **线程同步**:掌握synchronized关键字的使用,理解volatile变量的作用。 - **并发工具类**:学习如何使用ConcurrentHashMap、CountDownLatch等并发工具类解决多线程问题。 #### 8. 泛型与反射 - **泛型**:深入...
- **线程同步**:讲解synchronized关键字和volatile变量的作用,避免数据竞争问题。 - **死锁**:探讨死锁产生的原因及其解决方法。 ### 第六章:输入/输出流 - **流的概念**:了解流的基本概念以及其分类(字节流...