JAVA并发编程5

说明:先上代码,笔记后续补充。
public class LockTest1 {
/**
* 锁嵌套会出现死锁
* 避免 1.尽量不要写锁的嵌套(约等于废话,因为写了嵌套那么肯定是需要它) 2.锁嵌套的顺序(都调用getLock方法) 3.引入超时机制
*/
//显示锁Lock,可重入锁
//可中断锁,Lock就是,可以中断的
//公平锁,synchronized是随机锁,不公平
//乐观锁,悲观锁 数据库层面
Lock lock = new ReentrantLock();

/**
* 读 上readerLock 写上WriteLock
*/
ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

//锁 locka lockb
private Object locka = new Object();
private Object lockb = new Object();

public static void main(String[] args) {
new LockTest1().deadLock();
}
/**
* 嵌套锁
*/
private void deadLock(){
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
getLock();
// synchronized (locka){
// try {
// System.out.println(Thread.currentThread().getName()+"获取A锁!");
// Thread.sleep(500);
// System.out.println(Thread.currentThread().getName()+"睡眠500ms");
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName()+"需要B锁");
// synchronized (lockb){
// System.out.println(Thread.currentThread().getName()+"B锁中!");
// }
// }
}
},"thread1");

Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
getLock();
// synchronized (lockb){
// try {
// System.out.println(Thread.currentThread().getName()+"获取B锁!");
// Thread.sleep(500);
// System.out.println(Thread.currentThread().getName()+"睡眠500ms");
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName()+"需要A锁");
// synchronized (locka){
// System.out.println(Thread.currentThread().getName()+"A锁中!");
// }
// }
}
},"thread2");

thread1.start();
thread2.start();
}

public void getLock(){
synchronized (locka){
try {
System.out.println(Thread.currentThread().getName()+"获取A锁!");
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+"睡眠500ms");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"需要B锁");
synchronized (lockb){
System.out.println(Thread.currentThread().getName()+"B锁中!");
}
}
}
}

Lock 显式锁 是一个接口,其中主要包含以下几个方法
获取锁:lock() lockInterruptibly() tryLock()
释放锁:unlock()

转载于:https://www.cnblogs.com/sleepy-goblin/p/8910052.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值