并发编程基本概念
一、原⼦性
⼀个操作或者多个操作,要么全部执⾏并且执⾏的过程不会被任何因素打断,要么就都不执⾏。
原⼦性是拒绝多线程操作的,不论是多核还是单核,具有原⼦性的量,同⼀时刻只能有⼀个线程来对它进⾏操作。 简⽽⾔之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原⼦性。例如 a=1是原⼦性操作,但是 a++和a +=1就不是原⼦性操作。
Java中的原⼦性操作包括:
- 基本类型的读取和赋值操作,且赋值必须是值赋给变量,变量之间的相互赋值不是原⼦性操作;
- 所有引⽤reference的赋值操作;
- java.concurrent.Atomic.* 包中所有类的⼀切操作。
二 、可⻅性
指当多个线程访问同⼀个变量时,⼀个线程修改了这个变量的值,其他线程能够⽴即看得到修改的值。
在多线程环境下,⼀个线程对共享变量的操作对其他线程是不可⻅的。Java提供了volatile来保证可⻅性,当⼀个变 量被volatile修饰后,表示着线程本地内存⽆效,当⼀个线程修改共享变量后他会⽴即被更新到主内存中,其他线 程读取共享变量时,会直接从主内存中读取。当然,synchronize和Lock都可以保证可⻅性。synchronized和Lock 能保证同⼀时刻只有⼀个线程获取锁然后执⾏同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因 此可以保证可⻅性。
三、有序性
即程序执⾏的顺序按照代码的先后顺序执⾏。
Java内存模型中的有序性可以总结为:如果在本线程内观察,所有操作都是有序的;如果在⼀个线程中观察另⼀个 线程,所有操作都是⽆序的。前半句是指“线程内表现为串⾏语义”,后半句是指“指令重排序”现象和“⼯作内存主主 内存同步延迟”现象。 在Java内存模型中,为了效率是允许编译器和处理器对指令