区分volatile和 synchrozied的使用场景,首先需要了解多线程环境下,线程的工作方式
(转载)
在多线程环境下,每个线程都保留一个线程上下文,存储了主存中共享变量的副本,因此会带来两个问题:1、可见性 2、原子性
可见性:
多线程环境下,如果后一个线程访问到的变量值是前一个线程修改后的变量值,说明这个变量是可见的,否则就是非可见的。
原子性:
变量的访问是原子的,即同一时刻只能有一个线程对其访问。
解决多线程环境下的可见性和原子性,就要用到volatile和 synchrozied;
一、volatile
所谓volatile,就是告诉处理器,每次变量的访问都直接在主存中操作;
多线程编程时,使用volatile的好处是:更高的吞吐量、更少的代码;
使用volatile可以解决多线程下变量的可见性问题,但是volatile很容易被误用,用来进行原子性操作。
较为常见的case为多线程下计数器的实现
public volatile int i;
i++;
因为i++是一个复合操作,即i=i+1;(先读主内存,后修改,然后刷新主内存)
所以多线程下,有可能在在刷新主内存前已经有另外一个线程读取了旧值。
二、synchronized
线程同步关键字,通过对变量或者语句块使用,可以保证操作的原子性。
- 大小: 57.8 KB
分享到:
相关推荐
讲解了锁的两种特性,互斥和可见;volatile和synchronize的用法和区别
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
主要介绍了java中volatile和synchronized的区别与联系的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下
主要为大家详细介绍了Java关键字volatile和synchronized的作用和区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了java多线程中的volatile和synchronized用法分析,以实例的形式分析了在多线程中volatile和synchronized的用法区别与使用原理,具有一定的参考借鉴价值,需要的朋友可以参考下
volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完全代替synchronized,volatile有synchronized可见性的特性,但没有synchronized原子性的特性。 可见性即用volatile关键字修饰的成员变量表明...
volatile和synchronized的区别:1).volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。...
关联自己的博客《并发编程(一)》中的附件,主要提供一些demo供大家演示和使用,主要涉及一些并发的一些的基本使用,包括synchronized关键字、volatile关键字。
并发编程关键字
synchronized关键字编译后会在同步块前后形成monitorenter和monitorexit两个字节码指令 执行monitorenter指令时需要先获得对象的锁(每个对象有一个监视器锁monitor),如果这个对象没被锁或者当前线程已经获得...
通过Callable和Future接口创建线程三、Java内存模型概念四、内存间的交互操作五、volatile和synchronized的区别 写在前面:提起多线程大部门同学可能都会皱起眉头不知道多线程到底是什么、什么时候可以用到、用的...
主要介绍了Java线程之线程同步synchronized和volatile详解,具有一定参考价值,需要的朋友可以了解下。
并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock。 Synchronized 和 Lock的概念 Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized...
Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)
Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块...
volatile是比synchronized关键字更轻量级的同步机制,访问volatile变量时不会执行加锁操作,因此不会使执行线程阻塞。 volatile保证可见性和禁止指令重排序,底层是通过“内存屏障”来实现,但不保证原子性。 写入...
1、synchronized 关键字和 volatile 关键字的区别 synchronized 关键字和 volatile 关键字是两个互补的存在,而不是对立的存在! volatile 关键字是线程同步的轻量级实现,所以volatile 性能肯定比synchronized...
主要介绍了Synchronized与Volatile区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁,而volatile就可以说是JVM提供的最轻量级的同步机制。JMM告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存...