北京建设工程信息网站,建行网站网址是多少,网站服务是什么,wordpress国内速度优化转载自 高级java必须清楚的概念#xff1a;原子性、可见性、有序性 原子性、可见性、有序性是多线程编程中最重要的几个知识点#xff0c;由于多线程情况复杂#xff0c;如何让每个线程能看到正确的结果#xff0c;这是非常重要的。 原子性 原子性是指一个线程的操作是不能…转载自 高级java必须清楚的概念原子性、可见性、有序性 原子性、可见性、有序性是多线程编程中最重要的几个知识点由于多线程情况复杂如何让每个线程能看到正确的结果这是非常重要的。 原子性 原子性是指一个线程的操作是不能被其他线程打断同一时间只有一个线程对一个变量进行操作。在多线程情况下每个线程的执行结果不受其他线程的干扰比如说多个线程同时对同一个共享成员变量n100次如果n初始值为0n最后的值应该是100所以说它们是互不干扰的这就是传说的中的原子性。但n并不是原子性的操作要使用AtomicInteger保证原子性。 可见性 可见性是指某个线程修改了某一个共享变量的值而其他线程是否可以看见该共享变量修改后的值。在单线程中肯定不会有这种问题单线程读到的肯定都是最新的值而在多线程编程中就不一定了。 每个线程都有自己的工作内存线程先把共享变量的值从主内存读到工作内存形成一个副本当计算完后再把副本的值刷回主内存从读取到最后刷回主内存这是一个过程当还没刷回主内存的时候这时候对其他线程是不可见的所以其他线程从主内存读到的值是修改之前的旧值。 像CPU的缓存优化、硬件优化、指令重排及对JVM编译器的优化都会出现可见性的问题。 有序性 我们都知道程序是按代码顺序执行的对于单线程来说确实是如此但在多线程情况下就不是如此了。为了优化程序执行和提高CPU的处理性能JVM和操作系统都会对指令进行重排也就说前面的代码并不一定都会在后面的代码前面执行即后面的代码可能会插到前面的代码之前执行只要不影响当前线程的执行结果。所以指令重排只会保证当前线程执行结果一致但指令重排后势必会影响多线程的执行结果。 虽然重排序优化了性能但也是会遵守一些规则的并不能随便乱排序只是重排序会影响多线程执行的结果。