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



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


阅读更多
文章标签: synchronized
个人分类: 并发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭