Java中的锁

Java中的锁
锁的基本概念高并发场景下因数据一致性问题需要通过锁来解决锁的分类乐观锁悲观锁乐观锁本质上不加锁通过CAS、版本号等方式进行比较和重试避免了内核态切换的开销线程不会阻塞Java中的乐观锁有Atomic原子类MySQL实现乐观锁的方式有加版本号存在ABA的问题可以通过加版本号解决悲观锁保证同一时间只有一个线程能拿到锁后续线程会阻塞开销比较大通过Synchronized、Lock、实时读等方式实现悲观锁Java中的悲观锁有Synchronized、LockMySQL中实现悲观锁的方式有实时读、写锁可重入锁不可重入锁可重入锁指的是对于同一个对象可以有多个线程拿到锁Java中大部分都是可重入锁不可重入锁指的是一个对象只能有一个线程拿到锁容易造成死锁的问题。公平锁非公平锁公平锁线程排队拿锁性能比较好非公平锁线程可以插队拿锁开销比较大读锁写锁读锁共享锁多个线程可以同时获取不会阻塞写锁独占锁同一时间只能有一个线程持有后续线程会阻塞精简版乐观锁无锁 CAS无阻塞有 ABA原子类、version 版本悲观锁加锁阻塞开销大synchronized、Lock、mysql 行锁可重入同一线程重复拿锁不死锁公平锁排队、性能低非公平可插队、吞吐量高读锁共享、写锁独占读多写少场景用读写锁。