Java多线程06_死锁和Lock锁
1.死锁
死锁是一个有趣的错误,举个例子,你我手上都有对方想要的东西然后结束进程,但你我手上都还锁着自己的东西,这时候双方都无法继续下去!
解决办法,总有一方得先让步,解除锁!!!
死锁解决方法比较简单,而且死锁属于低级错误!!
以下例子就是模拟死锁,以及解决死锁
package deadLock;
/**
* 死锁:
* 多个线程互相抱有对方需要的资源,然后形成僵持。
* 结果一直会运行,导致程序卡死,就是死锁
*/
/**
* 如何解决,使得每个人获得就都将锁释放再去取别人的锁
*/
//口红
class LipStick{
}
//镜子
class Mirror{
}
//化妆
class MakeUp extends Thread{
//用static保证需要的资源只有一份
static Mirror mirror = new Mirror();//镜子
static LipStick lipStick = new LipStick();//口红
int choice; //选择
String girlName;//选择的人
public MakeUp(int choice, String girlName) {
this.choice = choice;
this.girlName = girlName;
}
//化妆,互相持有对方的锁,就是需要拿到对方的资源
private void makeUp() throws InterruptedException {
if(choice==0){
synchronized (lipStick){//获得口红的锁
System.out.println(this.girlName+"获得口红的锁..");
Thread.sleep(1000);
// synchronized (mirror){//一秒钟后想获得镜子的锁
// System.out.println(this.girlName+"获得镜子的锁..");
// }
}
/**
*重点
*获得口红后把锁释放掉
*/
synchronized (mirror){//一秒钟后想获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁..");
}
}
else{//相反
synchronized (mirror){
System.out.println(this.girlName+"获得镜子的锁..");
Thread.sleep(2000);
// synchronized (lipStick){
// System.out.println(this.girlName+"获得口红的锁..");
// }
}
synchronized (lipStick){
System.out.println(this.girlName+"获得口红的锁..");
}
}
}
@Override
public void run() {
try {
makeUp();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class TestDeadLock {
public static void main(String[] args) {
MakeUp m1= new MakeUp(0,"小王");
MakeUp m2 = new MakeUp(1,"小唐");
m1.start();
m2.start();
}
}
2.Lock锁


类似于syn,只不过需要加入异常关闭lock锁,两者各有各的好处!!!
package senior;
import java.util.concurrent.locks.ReentrantLock;
/**
* lock效率高,
* 但练习中一般先不用
*/
class BuyTicket implements Runnable{
private int ticketNums = 10;
/**
* 定义锁
*/
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
//买票
while(true){
//用try将锁打开和关闭
try {
lock.lock();
if(ticketNums<0) break;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("买到了第"+ticketNums--+"张");
}finally {
lock.unlock();
}
}
}
}
public class TestLock {
public static void main(String[] args) {
BuyTicket t1 = new BuyTicket();
new Thread(t1,"小王").start();
new Thread(t1,"小明").start();
new Thread(t1,"小李").start();
}
}
本文通过生动的例子介绍了Java多线程中的死锁现象及其解决方法,并对比了synchronized与Lock锁的不同之处,展示了Lock锁的使用方式。

2284

被折叠的 条评论
为什么被折叠?



