AbstractQueuedSynchronizer抽象队列同步器
1.6之后首先是偏向锁,如果有其他线程对它进行征用,
会升级为轻量级锁,轻量级锁实现多数是自旋锁(spin lock),
如果有个线程旋了10次(不确定)仍然没有拿到锁,
升成重量级锁,悲观锁。
reentrantlock可重入锁    底层AQS
jdk1.5对synchronized进行了优化,怎么进行的优化,就是偏向锁、轻量级锁、重量级锁
synchronized OS
lock 不用OS
CAS:CompareAndSetState
乐观锁:每次获取数据的时候,都不会担心数据被修改,所有每次获取数据的时候都不会进行加锁,
但是在更新数据的时候需要判断数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,
如果数据没有被其他线程修改,则进行更新。一般使用CAS操作方式。

乐观锁使用场景

      比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

悲观锁

        每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。在Java中,synchronized的思想也是悲观锁

悲观锁使用场景

       比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。

CAS一直自旋消耗cpu,但是synchronized的wait不消化cpu,
所有CAS更偏向于应用在并发不激烈,只需自旋几次就可以拿到这把锁。