Java多线程技术-Volatile关键字解析
2018-06-18 03:49:51来源:未知 阅读 ()
分析volatile关键字可以从这三个方面分析,什么是程序的原子性,什么是程序的可见性,什么是程序的有序性
什么是程序的原子性
以下语句那些是原子操作?
public class ThreadCounter implements Runnable { private int count = 0; @Override public void run() { ++count; // count++; } public static void main(String[] args) throws InterruptedException { ThreadCounter thread = new ThreadCounter(); for(int i = 0; i< 10000; i++){ new Thread(thread).start(); } Thread.sleep(1000);//确保线程执行完 System.out.println(thread.count); } }
演示结果:语句一和二是非原子操作,语句三和四是原子操作
解决方法:
public class ThreadCounter implements Runnable { private int count = 0; @Override public void run() { synchronized (this) { ++count; // count++; } } public static void main(String[] args) throws InterruptedException { ThreadCounter thread = new ThreadCounter(); for(int i = 0; i< 10000; i++){ new Thread(thread).start(); } Thread.sleep(1000);//确保线程执行完 System.out.println(thread.count); } }
什么是程序的可见性?
public class VolatileExample { boolean v =false; private void write(){ v =true; } private void read(){ while(!v){ } System.out.println("程序结束!"); } public static void main(String[] args) throws InterruptedException { final VolatileExample example = new VolatileExample(); Thread thread1 = new Thread(()->{example.read();}); thread1.start(); Thread.sleep(1000); Thread thread2 = new Thread(()->{example.write();}); thread2.start(); } }
public class VolatileExample { volatile boolean v =false; private void write(){ v =true; } private void read(){ while(!v){ } System.out.println("程序结束!"); } public static void main(String[] args) throws InterruptedException { final VolatileExample example = new VolatileExample(); Thread thread1 = new Thread(()->{example.read();}); thread1.start(); Thread.sleep(1000); Thread thread2 = new Thread(()->{example.write();}); thread2.start(); } }
什么是程序的有序性?
Volatile应用场景
public class ThreadTest { private volatile boolean isContinue = false; private class HandleThread extends Thread { @Override public void run() { while (isContinue) { // do something } }; } }
2. double check
总结:
volatile在可见性和有序性可以起到作用,但是不能保证原子性,是一种弱同步。
synchronized可以保证原子性,可见性,一致性,是一种强同步。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash