Sylvan

ReentrantReadWriteLock

ReentrantReadWriteLock 是 Java 的一种读写锁,它允许多个读线程同时访问,但只允许一个写线程访问(会阻塞所有的读写线程)。这种锁的设计可以提高性能,特别是在读操作的数量远远超过写操作的情况下。 在并发场景中,为了解决线程安全问题,我们通常会使用关键字 synchronized 或者 JUC 包中实现了 Lock 接口的 ReentrantLock。但它们都是独占式...

可重入锁ReentrantLock

ReentrantLock 重入锁,是实现Lock 接口 的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源重复加锁,即当前线程获取该锁后再次获取不会被阻塞。 要想支持重入性,就要解决两个问题: 在线程获取锁的时候,如果已经获取锁的线程是当前线程的话则直接再次获取成功; 由于锁会被获取 n 次,那么只有锁在被释放同样的 n 次之后,该锁才算是完全释放...

锁的分类和JUC

锁的分类 乐观锁、悲观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java 中,synchronized 关键字是最典型的悲观锁。 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会加锁,只是在更新数据的时候会去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当...

volatile关键字(Java)

volatile 可以保证可见性,但不保证原子性: 当写一个 volatile 变量时,JMM 会把该线程在本地内存中的变量强制刷新到主内存中去; 这个写操作会导致其他线程中的 volatile 变量缓存无效。 volatile 会禁止指令重排 重排序需要遵守的规则: 重排序不会对存在数据依赖关系的操作进行重排序。比如:a=1;b=a; 这个指令序列,因为第二个操作...

synchronized的四种锁状态

Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁。 类锁,其实就是 Class 对象的锁。 Class 对象是一种特殊的 Java 对象,代表了程序中的类和接口。Java 中的每个类型(包括类、接口、数组以及基础类型)在 JVM 中都有一个唯一的 Class 对象与之对应。这个 Class 对象被创建的时机是在 JVM 加载类时,由 JVM ...