悲观锁:不相信,这里会是安全的,必须全部上锁,独占,排他 : synchronized
乐观锁:相信,这里是安全的。
独占锁:ReentrantLock,synchronized 在同一个时间点只能被一个线程锁持有
死锁:
死锁产生的必要条件如下:
1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
synchronized和LOCK区别:
1)Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问;
2)Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
3)在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;
CountDownLatch与thread.join()的区别:
总结:调用join方法需要等待thread执行完毕才能继续向下执行,而CountDownLatch只需要检查计数器的值为零就可以继续向下执行,相比之下,CountDownLatch更加灵活 一些,可以实现一些更加复杂的业务场景。
案例:假设A,B,C的工作都分为两个阶段,A只需要等待B,C各自完成他们工作的第一个阶段就可以执行了。
join只能等待所有的线程执行完成。CountDownLatch可以让A在执行完1阶段功能就可以开始执行。
见:https://www.jianshu.com/p/795151ac271b
==================================synchronized
同步锁:对每一个对象有且仅有一个同步锁,
同步锁是共享的,但是在同一个时间点,同步锁只能被一个线程得到。
获取同步锁的线程持有cpu调度。
其他线程没有获取同步锁需要等待。
同步锁释放的条件有且仅有两种:
1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;
2)线程执行发生异常,此时JVM会让线程自动释放锁。
====================================LOCK JUC锁
互斥锁:ReentrantLock 即独占锁
可重入锁 ReentrantLock 可以被单个线程多次获取。
共享锁:CountDownLatch 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,直到已释放所有共享锁。获准共享锁的事务只能读数据,不能修改数据
公平锁:ReentrantLock 通过一个FIFO的等待队列来管理获取该锁所有线程的,有优先级的锁
非公平锁:ReentrantLock 不管自己是不是在队列的开头都会获取锁,无优先级的锁
读写锁:ReadWriteLock
分段锁:Segment ConcurrentHashMap(1.7)
static class Segment<K, V> extends ReentrantLock implements Serializable
自旋锁:与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
CountDownLatch和CyclicBarrier的区别
(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
(02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
AQS
LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程。
主要是通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作的。