悲观锁:当前线程去 *** 作数据的时候,总是认为别的线程会去修改数据,所以每次 *** 作数据的时候都会上锁,别的线程去 *** 作数据的时候就会阻塞,比如synchronized;
乐观锁:当前线程每次去 *** 作数据的时候都认为别人不会修改,更新的时候会判断别人是否会去更新数据,通过版本来判断,如果数据被修改了就拒绝更新,例如cas是乐观锁,但是严格来说并不是锁,通过原子性来保证数据的同步,例如数据库的乐观锁,通过版本控制来实现,cas不会保证线程同步,乐观的认为在数据更新期间没有其他线程影响
总结:悲观锁适合写 *** 作多的场景,乐观锁适合读 *** 作多的场景,乐观锁的吞吐量会比悲观锁高
2、公平锁和非公平锁公平锁:有多个线程按照申请锁的顺序来获取锁,就是说,如果一个线程组里面,能够保证每个线程都能拿到锁,例如:ReentrantLock(使用的同步队列FIFO)
非公平锁:获取锁的方式是随机的,保证不了每个线程都能拿到锁,会存在有的线程饿死,一直拿不到锁,例如:synchronized,ReentrantLock
总结:非公平锁性能高于公平锁,更能重复利用CPU的时间
3、可重入锁和不可重入锁可重入锁:也叫递归锁,在外层使用锁之后,在内层仍然可以使用,并且不会产生死锁
不可重入锁:在当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞
总结
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)