Java中如何实现线程同步

  介绍

这篇文章给大家介绍Java中如何实现线程同步,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Java可以用来干什么

Java主要应用于:1。网页开发;2。Android开发;3。客户端开发;4。网页开发;5。企业级应用开发;6。Java大数据开发;7。游戏开发波动等。

先看个例子

class  Test  {//,定义一个全局变量   ,,,private  boolean  isRun =,真的;   ,//才能,从主线程调用发起   ,,,public  void 过程(),{   ,,,,,,,测试();   ,,,,,,,try  {   ,,,,,,,,,,,thread . sleep (2000);   ,,,,,,,},catch  (InterruptedException  e), {   ,,,,,,,,,,,e.printStackTrace ();   ,,,,,,,}   ,,,,,,,停止();   ,,,}//,启动一个子线程循环读取isRun   ,,,private  void 测试(),{   ,,,,,,,new 线程(new  Runnable (), {   ,,,,,,,,,,@Override   ,,,,,,,,,,,public  void 运行(),{   ,,,,,,,,,,,,,,,while  (isRun), {//,疑问,如果我这里有一些打印的语句或者线程睡眠的语句,子线程在//,主线程将isRun改为假的时候,就会跳出死循环,反之,如果循环体//,内是空的,就算在主线程改了isRun的值,也无法及时跳出循环,为什么?//,当然,如果将isRun变量使用挥发性修饰就没有此问题   ,,,,,,,,,,,,,,,}   ,,,,,,,,,,,}   ,,,,,,,}).start ();   ,,,}   ,   ,,,private  void 停止(),{   ,,,,,,,isRun =,假;   ,,,}   }

有一点是一定的,就是子线程访问isRun的时候会拷贝一份放到自己的线程(工作内存)里,这样在读写的时候可能就不会和外面isRun的值实时是匹配上的,所以就会出现意想不到的问题。

所以我们使用挥发性修饰,这样当有多线程同时访问一个变量时,都会自动同步一下。显然这样会带来一定的性能损失,但是如果确实需要还是要这么做的。

但是,有一个问题来了,使用波动一定能就可解决多线程同步的问题了吗?那我们看下面这个例子:

class  TestSynchronize  {   ,//,使用挥发性修饰的变量   ,,,private  volatile  int  x =, 0;   ,   ,,,private  void 添加(),{   ,,,,,,,x + +;   ,,,}   ,   ,,,public  void 测试(),{//,启动第一个线程,进行100年万次自加   ,,,,,,,new 线程(new  Runnable (), {   ,,,,,,,,,,@Override   ,,,,,,,,,,,public  void 运行(),{   ,,,,,,,,,,,,,,,for  (int  i=0, i<, 1 _000_000;,我+ +),{   ,,,,,,,,,,,,,,,,,,,添加();   ,,,,,,,,,,,,,,,}   ,,,,,,,,,,,,,,,System.out.println(“第一个线程x=? +, x);   ,,,,,,,,,,,}   ,,,,,,,}).start ();//,启动第二个线程,进行100年万次自加   ,,,,,,,new 线程(new  Runnable (), {   ,,,,,,,,,,@Override   ,,,,,,,,,,,public  void 运行(),{   ,,,,,,,,,,,,,,,for  (int  i=0, i<, 1 _000_000;,我+ +),{   ,,,,,,,,,,,,,,,,,,,添加();   ,,,,,,,,,,,,,,,}   ,,,,,,,,,,,,,,,System.out.println(“第二个线程x=? +, x);   ,,,,,,,,,,,}   ,,,,,,,}).start ();   ,,,}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Java中如何实现线程同步