网站建设合同通用范本,关键词如何排名在首页,东莞seo关键词,百度seo排名如何提升java 并发线程当在不同线程之间共享对象的状态时#xff0c;除了原子性外#xff0c;其他问题也会发挥作用。 其中之一是可见性。 关键事实是#xff0c;如果没有同步#xff0c;则不能保证指令按照它们在源代码中出现的顺序执行。 这不会影响单线程程序中的结果#xff… java 并发线程 当在不同线程之间共享对象的状态时除了原子性外其他问题也会发挥作用。 其中之一是可见性。 关键事实是如果没有同步则不能保证指令按照它们在源代码中出现的顺序执行。 这不会影响单线程程序中的结果但是在多线程程序中如果一个线程更新值则另一个线程可能在需要或不看到更新时看不到更新一切。 在多线程环境中程序有责任确定何时在不同线程之间共享数据并采取相应措施使用同步。 NoVisibility中的示例包含两个共享标志的线程。 写入器线程更新标志而读取器线程等待直到设置了标志 public class NoVisibility {private static boolean ready;public static void main(String[] args) throws InterruptedException {new Thread(new Runnable() {Overridepublic void run() {while (true) {if (ready) {System.out.println(Reader Thread - Flag change received. Finishing thread.);break;}}}}).start();Thread.sleep(3000);System.out.println(Writer thread - Changing flag...);ready true;}
} 该程序可能会导致无限循环因为读取器线程可能看不到更新的标志并永远等待。 通过同步我们可以确保不会发生这种重新排序从而避免了无限循环。 为了确保可见性我们有两种选择 锁定保证可见性和原子性只要使用相同的锁定。 易挥发的字段保证可见性。 volatile关键字的作用类似于某种同步块。 每次访问该字段时就像输入同步块一样。 主要区别在于它不使用锁。 因此它可能适用于上述示例更新共享标志但不适用于复合操作。 现在我们将volatile关键字添加到ready字段以修改前面的示例。 public class Visibility {private static volatile boolean ready;public static void main(String[] args) throws InterruptedException {new Thread(new Runnable() {Overridepublic void run() {while (true) {if (ready) {System.out.println(Reader Thread - Flag change received. Finishing thread.);break;}}}}).start();Thread.sleep(3000);System.out.println(Writer thread - Changing flag...);ready true;}
} 可见性将不再导致无限循环。 作者线程进行的更新将对读者线程可见 Writer thread - Changing flag... 读取器线程-收到标志更改。 精加工螺纹。 结论 我们了解了在多线程程序中共享数据时的另一种风险。 对于一个简单的示例如此处所示我们可以简单地使用一个volatile字段。 其他情况将要求我们使用原子变量或锁定。 您可以在github上查看源代码。 翻译自: https://www.javacodegeeks.com/2014/08/java-concurrency-tutorial-visibility-between-threads.htmljava 并发线程