Java同步下波动的关键字是什么

  介绍

这篇文章主要讲解了“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陷入死循环。

癑ava同步下波动的关键字是什么”,

解决方法:

那么如何解决这样的问题呢?
很简单,使用不稳定的关键字。让线程不得不从主内存中读值取国旗。

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同步下波动的关键字是什么