01-3 JMM-多线程

        由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问的一致性和安全性将会受到严重挑战。如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴。对于串行程序来说,根本就是小菜一碟,如果你读取一个变量,这个变量的值是1,那么你读到的一定是1,就是这么简单的问题在并行程序中居然变得复杂起来。事实上,如果不加控制的任由线程胡乱并行,即使原本是1的数据,你也有可能读到2。因此,我们需要在深入了解并行机制的前提下,在定义一种规则,保证多个多线程间可以有效地、正确地协同工作。而JMM也就是为此而生的。

        JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的。因此,我们首先必须了解这些概念。

1、原子性(Atomicity)

        原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。

        比如,对于一个静态全局变量int i,两个线程同时对它赋值,线程A给它赋值1,线程B给他赋值为-1,那么不管这两个线程以何总方式、何种步调工作,i的值要么是1,要么是-1。线程A和线程B之间是没有干扰的。这就是原子性的一个特点,不可被中断。

        但如果我们不使用int型数据而使用long型数据,可能就没有那么幸运了。对于32位系统来说,long型数据的读写不是原子性的(因为long型数据有64位)。也就是说,如果两个线程同时对long型数据进行写入(或者读取),则对线程之间的结果是有干扰的。

2、可见性(Visibility)

 

你可能感兴趣的:(多线程,多线程)