时间:2021-05-19
简介关键词:Synchronize与volatile
volatile问题抛出:
让我们看到这样一个问题,我们设置一个含有boolean标志位的类Test,以及两个Runable接口实例,分别为MyThread1,MyThread2。
在MyThread1中通过while循环判断flag是否更改,如果更改便结束循环退出。
在MyThread2中改变flag值。
代码如下:
Test:
MyThread1:
public class MyThread1 implements Runnable{ Test test; public MyThread1(Test test){ this.test = test; } @Override public void run() { while (test.flag){ } System.out.println(Thread.currentThread().getName()+" 我已退出"); }}MyThread2:
public class MyThread2 implements Runnable{ Test test; public MyThread2(Test test){ this.test = test; } @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } test.flag = false; }}main函数:
public static void main(String[] args) { Test test = new Test(); MyThread1 myThread1 = new MyThread1(test); MyThread2 myThread2 = new MyThread2(test); Thread thread1 = new Thread(myThread1); Thread thread2 = new Thread(myThread2); thread1.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } thread2.start();}那么如何解决这样的问题呢?
很简单,使用volatile关键字。让线程不得不从主内存中读取flag值。
在我们添加volatile关键字后,Thread1便可以正常退出。
在Synchronize下的volatile:
此时我们已经了解了volatile关键字的作用,那么在我们的volatile关键字中,Synchronize有着怎样的作用呢?
其实在我们实际使用中,volatile其实也是有一些隐患的。
例如:我们创造10条线程,每条线程都使volatile修饰的int常量增加1000000次。
在我们使用volatile关键字时,需要注意操作是否为原子操作,以免造成线程不安全。
其实,对于原子操作,Java已经提供了Atomic原子类来解决。其中涉及了CAS机制,在不使用Synchronize的情况下,通过比较原值与当前值,不但性能高效,并且也能达到线程安全的目的。
到此这篇关于Synchronize下的volatile关键字 的文章就介绍到这了,更多相关Synchronize volatile关键字 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言在Java中,Java中volatile关键字十分重要本文全面&详细解析volatile关键字,希望你们会喜欢目录1.定义Java中的1个关键字/修饰符2.
volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。
前言在一些开源的框架的源码当中时不时都可以看到volatile这个关键字,最近特意学习一下volatile关键字的使用方法。volatile关键字:当多个线程进
前言近期看到C++标准中对volatile关键字的定义,发现和java的volatile关键字完全不一样,C++的volatile对并发编程基本没有帮助。网上也
volatile关键字经常用来修饰变量。不过,volatile本身很容易被误用。本篇就介绍一下volatile的原理和使用方式。在介绍volatile关键字原理