悲观锁:就像是担心别人会抢你的东西,所以一开始就紧紧抓住不放。Synchronized 和 lock 接口;适用情况:适用于临界区持锁时间比较长的情况,悲观锁可以避免大量的无用自旋等消耗,典型情况:1.临界区有IO操作;2.临界区代码复杂或者循环量大;3.临界区竞争非常激烈。
乐观锁:相信别人不会和你抢,只有在最后才检查是否真的有人抢了。原子类、并发容器;适用于并发写入少,大部分都是读取的场景,不加锁的能让读取性能大幅提高。
可重入锁:允许同一个线程多次获得同一把锁的锁机制。如果一个线程已经持有了锁,它可以再次尝试获取这把锁而不会造成死锁。
非可重入锁:不允许同一个线程多次获取同一把锁。如果一个线程试图获取一个它已经持有的锁,它将被阻塞,直到它释放这把锁。
公平锁:保证线程获取锁的公平性,避免“饥饿”现象,按照线程请求的顺序来分配锁。
非公平锁:线程获取锁的顺序是不确定的,哪个线程先抢到锁,哪个线程就先执行。
共享锁:共享锁允许多个线程同时访问同一个资源,但只允许读取,不允许修改。如果一个线程想要写入资源,它必须获取排它锁。
排它锁:当一个线程获得了排它锁,它就独占了这个资源,其他任何线程都不能访问这个资源,直到持有锁的线程释放它。
自旋锁:当一个线程尝试获取一个已经被其他线程持有的锁时,它不会放弃CPU资源,而是在原地“自旋”,不断检查锁是否可用。适用于多核服务器,在并发度不是特别高的情况下,比阻塞锁的效率高。适用于临界区比较短小的情况。
阻塞锁:当一个线程尝试获取一个已经被其他线程持有的锁时,它会被阻塞(即进入睡眠状态),直到锁变得可用。
可中断锁:一种在等待锁的过程中可以响应中断的锁机制。