《并发编程》--6.Java内存模型(JMM)的关键字volatile
2017-08-18 14:26
561 查看
Java的内存模型(JMM)都是围绕着原子性,有序性,可见性。一些特殊的场合下,需要用volatile等关键字保证这些特性。
当用volatile声明一个变量时,就相当于告诉虚拟机,这个变量极有可能在多个线程中修改。为了确保这个变量被修改后,程序的所有线程都能够意识到这个改动,虚拟机就必须采用一些特殊的手段,保证这个变量的可见性。
声明的代码如下:
static volatile int i = 0;注意:volatile虽然能很大程度的维护原子性,但是不能替代锁
一下一个简单的demo即可说明
public class volatileMain1 {
static volatile int i = 0;
public static class Task implements Runnable {
@Override
public void run(){
for(int k=0;k<10000;k++){
i++;//如果是原子性的,最终的是为100000(10个线程累计加10)
//实际是小于100000的
//证明volatile不能代替锁
}
}
public static void main(String[] args) throws InterruptedException {
Thread[] t = new Thread[10];
for(int i = 0;i<10;i++){
t[i] = new Thread(new Task());
t[i].start();
}
for(int i=0;i<10;i++){
t[i].join();
}
System.out.println(i);
}
}
}
实际的运行结果是小于100000的。。。
另外volatile也能保证数据的可见性和有序性,以后是一个简单的demo
public class volatileMain2 {
private static boolean ready;
private static String name;
private static class ReaderThread extends Thread{
@Override
public void run(){
while(!ready);//虚拟机在client模式下,由于JIT并没有做优化,主线程修改number,ReaderThread发现这个改动,退出程序
//虚拟机在server模式下,由于系统的优化,导致ReaderThread永远无法退出(因为readdy为false)
System.out.println("I am "+name);
}
}
public static void main(String[] args) throws InterruptedException {
new ReaderThread().start();
Thread.sleep(1000);
name = "yemt";
ready = true;
Thread.sleep(10000);
}
}
注意:可以使用Java虚拟机参数-server切换到Server模式
当用volatile声明一个变量时,就相当于告诉虚拟机,这个变量极有可能在多个线程中修改。为了确保这个变量被修改后,程序的所有线程都能够意识到这个改动,虚拟机就必须采用一些特殊的手段,保证这个变量的可见性。
声明的代码如下:
static volatile int i = 0;注意:volatile虽然能很大程度的维护原子性,但是不能替代锁
一下一个简单的demo即可说明
public class volatileMain1 {
static volatile int i = 0;
public static class Task implements Runnable {
@Override
public void run(){
for(int k=0;k<10000;k++){
i++;//如果是原子性的,最终的是为100000(10个线程累计加10)
//实际是小于100000的
//证明volatile不能代替锁
}
}
public static void main(String[] args) throws InterruptedException {
Thread[] t = new Thread[10];
for(int i = 0;i<10;i++){
t[i] = new Thread(new Task());
t[i].start();
}
for(int i=0;i<10;i++){
t[i].join();
}
System.out.println(i);
}
}
}
实际的运行结果是小于100000的。。。
另外volatile也能保证数据的可见性和有序性,以后是一个简单的demo
public class volatileMain2 {
private static boolean ready;
private static String name;
private static class ReaderThread extends Thread{
@Override
public void run(){
while(!ready);//虚拟机在client模式下,由于JIT并没有做优化,主线程修改number,ReaderThread发现这个改动,退出程序
//虚拟机在server模式下,由于系统的优化,导致ReaderThread永远无法退出(因为readdy为false)
System.out.println("I am "+name);
}
}
public static void main(String[] args) throws InterruptedException {
new ReaderThread().start();
Thread.sleep(1000);
name = "yemt";
ready = true;
Thread.sleep(10000);
}
}
注意:可以使用Java虚拟机参数-server切换到Server模式
相关文章推荐
- 全面理解Java内存模型(JMM)及volatile关键字
- 全面理解Java内存模型(JMM)及volatile关键字
- 全面理解Java内存模型(JMM)及volatile关键字
- 全面理解Java内存模型(JMM)及volatile关键字
- 全面理解Java内存模型(JMM)及volatile关键字
- 全面理解Java内存模型(JMM)及volatile关键字
- 全面理解Java内存模型(JMM)及volatile关键字(转载)
- Java多线程 -- 深入理解JMM(Java内存模型) --(四)volatile
- Java多线程-带你认识Java内存模型,内存分区,从原理剖析Volatile关键字
- Java多线程 -- 深入理解JMM(Java内存模型) --(四)volatile
- volatile关键字 / java内存模型 /AtomicInteger原子类 / ThreadLock
- 深入理解JMM(Java内存模型) --(四)volatile
- java基础知识(五)java内存模型和volatile关键字
- Java多线程 -- 深入理解JMM(Java内存模型) --(四)volatile
- Java并发(三) JMM与volatile关键字
- 深入理解JVM读书笔记五: Java内存模型与Volatile关键字
- Java并发编程:volatile关键字解析(三.Java内存模型)
- JVM内存结构和Java内存模型(volatile关键字保证数据同步)
- Java内存模型&volatile关键字
- 从Java内存模型解析volatile关键字