部门网站集约化建设方案,焦作建设企业网站公司,网站建设万禾,wordpress 如何登陆地址公平锁、非公平锁 公平锁指的是多线程按照申请锁的顺序来获取锁#xff1b;
非公平锁指的是多线程不按照申请锁的顺序来获取锁。可能会出现优先级反转#xff08;后者居上#xff09;
公平锁为了保证线程申请顺序#xff0c;势必要付出一定的性能代价#xff0c;因此其吞…公平锁、非公平锁 公平锁指的是多线程按照申请锁的顺序来获取锁
非公平锁指的是多线程不按照申请锁的顺序来获取锁。可能会出现优先级反转后者居上
公平锁为了保证线程申请顺序势必要付出一定的性能代价因此其吞吐量一般低于非公平锁
synchronized 支持非公平锁Lock默认非公平锁但支持公平锁
可重入锁递归锁
可重入锁又名递归锁是指 同一个线程在外层方法获取了锁在进入内层方法会自动获取锁。
synchronized void setA() throws Exception{Thread.sleep(1000);setB();
}synchronized void setB() throws Exception{Thread.sleep(1000);
}
如果使用的锁不是可重入锁的话setB()可能不会被当前线程执行从而造成死锁。可重入锁可以在一定程度上避免死锁。
自旋锁
自旋锁是指尝试获取锁的线程不会立即阻塞而是采用循环的方式去尝试获取锁
自旋等待的时间必须要有一定的限度如果自旋超过了限定次数就应当挂起线程。自旋锁的实现原理是CAS
乐观锁、悲观锁 乐观锁与悲观锁不是指具体的什么类型的锁而是处理并发同步的策略。
悲观锁 - 悲观锁对于并发采取悲观的态度认为不加锁的并发操作一定会出问题。悲观锁适合写操作频繁的场景
乐观锁 - 乐观锁对于并发采取乐观的态度认为不加锁的并发操作也没什么问题。对于同一个数据的并发操作是不会发生修改的。在更新数据的时候会采用不断尝试更新的方式更新数据。乐观锁适合读多写少的场景
独享锁与共享锁 独享锁与共享锁是一种广义上的说法从实际用途上来看也常被称为互斥锁与读写锁
独享锁 - 独享锁是指 锁一次只能被一个线程所持有
共享锁 - 共享锁是指 锁可被多个线程所持有
无锁 、 偏向锁、轻量级锁、重量级锁
一个对象其实有四种锁状态它们级别由低到高
无锁没有对资源进行锁定任何线程都可以尝试去修改它但同时只有一个线程能修改成功
偏向锁是指一段同步代码一直被一个线程所访问那么该线程会自动获取锁降低获取锁的代价
轻量级锁当锁是偏向锁的时候被另一个线程所访问偏向锁就会升级为轻量级锁其他线程会通过自旋的形式尝试获取锁不会阻塞提高性能
重量级锁若当前只有一个等待线程则该线程通过自旋进行等待。但是当自旋超过一定的次数或者一个线程在持有锁一个线程在自旋又有第三个线程来访时轻量级锁升级为重量级锁升级为重量级锁时等待锁的线程都会进入阻塞状态
死锁
两个或多个线程因竞争资源出现等待彼此造成永久阻塞的情况
产生条件 1.一段时间内某资源仅为一线程所占用 2.线程对已获得的资源保持不放 3.进程已获得的资源在未使用完之前不能剥夺 4.线程之间出现循环等待资源
public class DeadLock {static Object object1 new Object();static Object object2 new Object();public static void main(String[] args) {new Thread(() - {synchronized (object1){System.out.println(a线程已经获得锁1 -- 等待获得锁2);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (object2){System.out.println(a线程成功获得锁2);}}},a).start();new Thread(() - {synchronized (object2){System.out.println(b线程已经获得锁2 -- 等待获得锁1);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (object1){System.out.println(b线程成功获得锁1);}}},b).start();}
}解决办法 1.让程序每次至多只能获得一个锁 2.设计时考虑清楚锁的顺序尽量减少嵌在的加锁交互数量 3.死锁检测 4.设置加锁时限