synchronized
线程安全:当多个线程访问某个类时,这个类始终都能表现出正确的行为。
1.脏读
在setValue的时候加锁,最好在getValue的时候加锁,防止脏读。
引入ACID问题:
oracle一致性读 --undo:在做DML操作时,会把原先的值放在undo里,如果操作失败会roolback。
A查询一个1000W的数据查询时间中B在修改这个需要查询的值并修改成功,那么A读到这个值得时候undo如果有变化那么会去读undo的值,如果undo的值被修改多次即有多个客户端修改这个A查询的值,那么A会得到一个SNAPSHOT TOO OLD报错。
2、重入
1、相互调用
2、父子类中都用synchronized修饰了,是线程安全的,否则不安全。
3、遇到异常 记录日志continue或者当多个任务作为一个业务则可以报runtime异常跳出
BEGIN-END exception 记录日志
4、尽量不要用String常量作为锁,可以用New String(..)、用常量锁的时候,尽量不在要执行的时候修改锁内容、在用对象作为锁的时候,对象发生变化不影响锁。
volatile关键字 private volatile int num=...
线程执行流程图
volatile只能保证线程之间可见,不能保证原子性,要保证原子性需要使用automic类(automicInteger..),但是不能保证多个automic的原子性,需要加synchronized.
5、wait释放锁,notify不释放锁。当使用wait和notify的时候需要配合synchronized
wait和notify模拟阻塞队列:
运行结果:
"检查再运行"操作(如惰性初始化)和读-改-写操作(如自增)必须是原子性操作才能保证线程安全。
在不使用synchronized的时候可以选择使用已有的线程安全类
活跃度与性能 保证安全的同时保证并发量

浙公网安备 33010602011771号