基础知识:多个线程需要访问同一数据,synchrnized是一种的解决办法。
下面再看看并发包下的其他的技术:
CAS
Int i=0;
一段代码
// 会有多个线程进行执行
Public synchrnized void method(){
i++;
}
上述的代码肯定是存在线程安全问题的,在一个对象实例加synchrnized是可以解决的,这样就只有一个线程可以成功加锁,可以对他关联的monitor计数器加1。但是上述的解决办法效率低,一旦多个线程去并发进行加锁,串行化执行,效率不高。
于是可以借助于AtomicInteger去实现:
AtomicInteger i =new AtomicInteger (0);
// 会有多个线程进行执行--不需要synchrnized进行加锁也是线程安全的
Public void method(){
i++;
}
AtomicInteger 底层其实就是CAS (compare and set)原理图如下:
CAS底层是硬件级别保证原子性的,同一时间只有一个线程可以执行CAS,其他的线程此时会失败的,就需要重新读取进行设置。