JAVA内存模型与线程
1.java内存模型中定义了8中操作来完成变量从主内存拷贝到工作内存以及如何从工作内存同步回主内存的实现细节
lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态
unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用
load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入到工作内存的变量副本当中
use(使用):作用于工作内存中的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作
assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时将会执行这个操作
store(存储):作用于工作内存的变量,它把工作内存中的一个变量的值传送到主内存中,以便随后的write操作使用
write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入到主内存的变量中
2.同步块的可见性是"对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store,write操作)"
3.一个变量在同一时刻只允许一条线程对其进行lock操作
4.协同式线程调度:线程执行完任务通知CPU进行线程切换,但是不稳定
抢占式线程调度:由CPU自行调度,不会因为一个进程阻塞导致整个系统崩溃,可以通过设置线程的优先级来给某些线程多分配时间
5.悲观锁:无论共享数据是否会出现真的竞争,它都会进行加锁,线程会阻塞或者被唤醒,这样会导致线程被挂起,等待持有锁的线程释放锁.由于在进程挂起和恢复执行过程中存在着很大的开销。当一个线程正在等待锁时,它不能做任何事,所以悲观锁有很大的缺点。举个例子,如果一个线程需要某个资源,但是这个资源的占用时间很短,当线程第一次抢占这个资源时,可能这个资源被占用,如果此时挂起这个线程,可能立刻就发现资源可用,然后又需要花费很长的时间重新抢占锁,时间代价就会非常的高.
乐观锁:基于冲突检测的乐观并发策略,先进行操作,如果没有其他线程争用共享数据,则执行成功,如果有争用,产生了冲突,则采取其他的补偿措施(最常用的补偿措施就是不断的重试,直到成功为止), AtomicInteger的incrementAndGet()方法便是用改策略实现了原子操作.
6.并发与并行:并发是指CPU进行高效的切换,提高工作效率.并行是两件事情同时进行.举个简单例子:并发就是一个人给两个孩子喂饭,交替执行,并行就是两个人同时给两个孩子喂饭!

浙公网安备 33010602011771号