3.3 JMM是围绕着程序执行的原子性、有序性、可见性展开的。
原子性:一个操作是不可中断的。
有序性:单线程,按顺序依次执行;多线程,可能出现乱序现象,指令重排现象和工作内存与主内存同步延迟现象
可见性:当一个线程修改了某个共享变量的值,其他线程是否能够马上得知这个修改的值。
3.4 volatile作用:1)当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。
2)禁止指令重排序优化。
事务并发问题:
脏读:事务A读了B更新的数据,B回滚,A读了脏数据
不可重复读:一个事务两次读取的不一致(侧重修改)
幻读:一个事务发现了未被操作的数据(侧重增删)
四种 事务的隔离级别,解决并发问题,进行并发控制。
1)读未提交:不允许第一类更新丢失。允许脏读,不隔离事务。
事务读不阻塞其他事务读和写,事务写阻塞其他事务写但不阻塞读。
可以通过写操作加“持续-X锁”实现。
2) 读已提交:不允许脏读,允许不可重复读。(Oracle默认使用的隔离级别)
事务读不会阻塞其他事务读和写,事务写会阻塞其他事务读和写。可以通过写操作加“持续-X”锁,读操作加“临时-S锁”实现。
3)可重复读:不允许不可重复读。但可能出现幻读。(Mysql默认使用的隔离级别)
事务读会阻塞其他事务事务写但不阻塞读,事务写会阻塞其他事务读和写。
可以通过写操作加“持续-X”锁,读操作加“持续-S锁”实现。
4) 串行化:所有的增删改查串行执行。
“行级锁”做不到,需使用“表级锁”。
可串行化:如果一个并行调度的结果等价于某一个串行调度的结果,那么这个并行调度是可串行化的。
10. 进程和线程的区别是什么?
进程是CPU分配资源的最小单元,线程是CPU调度的基本单元,一个进程可以包含多个线程。必须至少有一个进程。
为什么有时候使用线程而不用进程?
因为进程启动的时候cpu需要给他分配资源,对系统压力比线程大,线程是轻量级的进程。
进程间通信的方式有什么?socket 管道 信号量 消息 共享内存
线程间通信的方式有什么?直接共享变量 管道
11. 产生死锁的四个条件:互斥、请求与保持、不可剥夺、循环等待
避免死锁,破坏任意一个条件即可:拷贝一份、主动放弃资源、强占、加锁(死锁检测,银行家算法)