线程原子操作synchronized-lock CAS(AtomicInteger)

# 线程原子性操作 ![image.png](https://cos.easydoc.net/31477061/files/km4isokh.png) - ,它要么完整的被执行,要么完全不执行,这种要么操作100%完成,要么无操作的特性,就叫做原子性。 ## synchronized - synchronized是Java中的关键字,是一种同步锁,一个线程执行完了才可以执行下一个线程 - 独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁CAS ![image.png](https://cos.easydoc.net/31477061/files/km4jblgi.png) ## lock java提供了实现类ReentrantLock和读写锁 ReentrantReadWriteLock。 ### ReentrantLock ![image.png](https://cos.easydoc.net/31477061/files/km4jnmct.png) - Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问; - Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。 ## CAS,Compare and Swap。 比较并交换 - 所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap。 ### AtomicInteger AtomicLong AtomicInteger i = new AtomicInteger(0); i.getAndIncrement(); //原子上增加一个当前值。(加1) i.getAndAdd(2); //原子上增加(2)个当前值(参数是几就 加几)。 i.set(1); //设置为给定值。 1.getAndDecrement() //原子减1当前值。 ### LongAdder DoubleAdder - 数组类的 会生成多个AtomicLong 进行cas操作 然后相加就可以得出全部 - 适用于大量线程并发 不用都抢一个 减少自旋 [jdk1.8中文文档](https://www.matools.com/api/java8) ![image.png](https://cos.easydoc.net/31477061/files/km4rjk6b.png) ### LongAccumulator ``` public static void main(String[] args) throws InterruptedException { /**/ LongAccumulator accumulator=new LongAccumulator( (x,y)->{ System.out.println("x="+x+",,"+"y="+y); return x+y; },0L ); for (int i=0 ;i<10 ;i++){ s++; accumulator.accumulate(s); } Thread.sleep(200); System.out.println(accumulator.get()); } ``` ## CAS的问题 ![image.png](https://cos.easydoc.net/31477061/files/km5vg3xr.png) ![image.png](https://cos.easydoc.net/31477061/files/km5vkejw.png)