这篇文章主要讲解了“Java同步下波动的关键字是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java同步下波动的关键字是什么”吧!
简介关键词:同步与挥发性
- <李>
同步:无论是对于同步同步方法异或是同步块,本质是对某对象或某类加锁,让多线程进行队列化的有序地同步执行。
李> <李>挥发性:用于修饰变量。在多线程执行过程中,禁止线程从工作内存(缓存)中读取值。
李>挥发性问题抛出:
让我们看到这样一个问题,我们设置一个含有布尔标志位的类测试,以及两个Runable接口实例,分别为MyThread1, MyThread2。
在MyThread1中通过而循环判断国旗是否更改,如果更改便结束循环退出。
在MyThread2中改变标志值。
代码如下:
测试:
public class Test { ,boolean flag =,真的; }
MyThread1:
public class MyThread1 implements Runnable { ,Test 测试; ,public MyThread1 (Test 测试){ 时间=this.test 才能;测试; ,} ,@Override ,public void  run (), { while 才能;(test.flag) { ,,} System.out.println才能(Thread.currentThread () . getname() +“,我已退出“); ,} }
MyThread2:
public class MyThread2 implements Runnable { ,Test 测试; ,public MyThread2 (Test 测试){ 时间=this.test 才能;测试; ,} ,@Override ,public void  run (), { try {才能 ,,thread . sleep (3000); ,,},catch (InterruptedException e), { ,,e.printStackTrace (); ,,} 时间=test.flag 才能;假; ,} }
主要函数:
public static void main (String [], args), { ,Test Test =, new 测试(); ,MyThread1 MyThread1 =, new MyThread1(测试); ,MyThread2 MyThread2 =, new MyThread2(测试); ,Thread thread1 =, new 线程(myThread1); ,Thread thread2 =, new 线程(myThread2); ,thread1.start (); ,try { ,,thread . sleep (1000); ,}catch (InterruptedException e), { e.printStackTrace才能(); ,} ,thread2.start (); }
- <李>
按照我们常规的想法,在延在睡眠时之后,Thread2会更改旗的值。而Thread1也会因此退出循环。
李> <李>但实际上,Thread1并没有因此退出循环。
李> <李>原因是Thread1并未从内存中读取国旗,而是直接从工作内存中读取。所以即便是Thread2已经更新了国旗的值,但Thread1工作内存中的国旗也并未更新。所以便导致了Thread1陷入死循环。
,
解决方法:
那么如何解决这样的问题呢?
很简单,使用不稳定的关键字。让线程不得不从主内存中读值取国旗。
volatile boolean flag =,真的,
在我们添加动荡的关键字后,Thread1便可以正常退出。
在同步下的波动:
此时我们已经了解了动荡的关键字的作用,那么在我们的反复无常的关键字中,同步有着怎样的作用呢?
<>强挥发性问题抛出:强>
其实在我们实际使用中,其波动实也是有一些隐患的。
例如:我们创造10条线程,每条线程都使挥发性修饰的int常量增加1000000次。
public class MyThread1 implements Runnable { ,volatile int num =, 0; ,@Override ,public void  run (), { for 才能;(int 小姐:=,0;,小姐:& lt;, 1000000;,我+ +),{ ,,num + +; ,,System.out.println (Thread.currentThread () . getname () +“,“+ num); ,,} ,} ,public static  void main (String [], args), { MyThread1 才能;MyThread1 =, new MyThread1 (); 线程才能[],arr =, new 线程[10]; for 才能;(int 小姐:=,0;,小姐:& lt;, 10;,我+ +),{ ,,arr[我],=,new 线程(myThread1); ,,} for 才能;(int 小姐:=,0;,小姐:& lt;, 10;,我+ +),{ ,,arr[我].start (); ,,} ,} }Java同步下波动的关键字是什么