=Start=
缘由:
学习整理。方便以后参考。
正文:
参考解答:
volatile的作用:
volatile关键字的作用是:使变量在多个线程间可见;但仅靠volatile不能保证线程的安全性。
volatile主要用在多个线程实例感知变量被更改了的场合,从而使得各个线程获得最新的值。它强制线程每次从主内存中读取变量,而不是从线程的私有内存中读取变量,从而保证了数据的可见性。
volatile和synchronized的区别:
- volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
- volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
- volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
- volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
- volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
package com.ixyzero.learn.multithread; public class Run { public static void main(String[] args) { // try { // RunThread thread = new RunThread(); // thread.start(); // Thread.sleep(1000); // thread.setRunning(false); // } catch (InterruptedException e) { // e.printStackTrace(); // } MyThread[] mythreadArray = new MyThread[100]; for (int i = 0; i < 100; i++) { mythreadArray[i] = new MyThread(); } for (int i = 0; i < 100; i++) { mythreadArray[i].start(); } } } public class RunThread extends Thread { volatile private boolean isRunning = true; public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) { this.isRunning = isRunning; } @Override public void run() { System.out.println("进入到run方法中了"); while (isRunning == true) { } System.out.println("线程执行完成了"); } } public class MyThread extends Thread { public volatile static int count; private static void addCount() { for (int i = 0; i < 100; i++) { count++; } System.out.println("count=" + count); } @Override public void run() { addCount(); } }
参考链接:
- JAVA多线程之volatile 与 synchronized 的比较
- 全面理解Java内存模型
- 深入理解Java内存模型(一)——基础
http://www.infoq.com/cn/articles/java-memory-model-1 - JAVA多线程之Synchronized关键字–对象锁的特点
- 【Java】 类锁与对象锁加锁 synchronized 小解
- 正确使用 Volatile 变量
- volatile和synchronized的区别
- Java多线程volatile和synchronized总结
- 哪个对象才是锁?
- Java synchronized method lock on object, or method?
=END=
《“Java的volatile和synchronized学习”》 有 1 条评论
聊聊java内存模型
https://www.jianshu.com/p/59ac0e3f9dc4
`
Java内存模型
重排序
内存屏障
volatitle的内存语义
final的内存语义
`