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的时候可以选择使用已有的线程安全类

 

 

 

 

活跃度与性能 保证安全的同时保证并发量

 

 

posted @ 2018-02-26 09:42  MysticalYcc  阅读(8)  评论(0)    收藏  举报