介绍
这篇文章给大家介绍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 nullJava中如何实现线程同步