黑马程序员_我的死锁练习
来源:互联网 发布:网络歌曲排行榜100首 编辑:程序博客网 时间:2024/05/21 17:54
/*思路:两个或多个线程,同时访问一个资源,为了避免某一点几个线程同时操作一个数据,造成错误,就实行了同步机制,锁定同一个数据某一点只让一个线程进行操作,
结束之后再由其他线程进行操作,这样就提高了多线程的安全性,但这样的操作也存在局限性,就是每一次访问都要查看是否已同步锁,就会造成步骤繁琐.若线程过长,这样就相似于单线程;
所以就采用了分段同步的方法提高效率,尽量缩短线程同步运算的时间,来提高效率.
这样也有一个弊端,就是当同步锁过多时,两个线程同步中需要互相访问对方的同步锁,在对方没有解锁的情况下自己不能访问,自己不解锁的情况下,对方又不能访问,这就造成了死锁现象.
实际开发中要避免死锁的发生,这样的现象多发生在嵌套同步之中,下面是一个很简单的双重同步锁嵌套死锁.*/
public class 死锁练习 {
public static void main(String[] args) {//当A门B门同时打开时就会死锁
双重门 t=new 双重门();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
}
}
class 双重门 implements Runnable
{ boolean a=true; //从A到B属于true状态,从B到A属于false状态
Object A=new Object();//设置两个门,双重门
Object B=new Object();
public void run(){
while("开始循环"!=null ){
if (a==true)
{
synchronized(A)
{System.out.println(Thread.currentThread().getName()+"拿到A钥匙进入A门去往B门");//此处是一个房间有两个门, A门和B门,经过之后A门会自动上锁,且不能回头且每个门有 //且只有一把钥匙.
// 拿到B门的钥匙之后,打开B门离开房间.此时A门钥匙释放;
synchronized (B)
{
System.out.println(Thread.currentThread().getName()+"从B门出来");
}
}
a=false;
}
else {
synchronized (B){
System.out.println(Thread.currentThread().getName()+"拿到B钥匙从B进入去往A门");//此处是一个房间有两个门, A门和B门,经过之后B门会自动上锁,且不能回头且每个门有 //且只有一把钥匙.
// 拿到A门的钥匙之后,打开A门离开房间.此时B门钥匙释放;
synchronized(A){
System.out.println(Thread.currentThread().getName()+"从A门出来");
}
}
a=true;
}
}
}
}
------- android培训、java培训、期待与您交流! ----------
- 黑马程序员_我的死锁练习
- 黑马程序员_我的多线程卖票练习
- 黑马程序员_线程死锁
- 黑马程序员_多线程死锁
- 黑马程序员_多线程(死锁)
- 黑马程序员_练习
- 黑马程序员_集合的小练习
- 黑马程序员_多线程的死锁和等待唤醒机制
- 黑马程序员_我的银行业务系统
- 黑马程序员_我的黑马程序员之路
- 黑马程序员_小练习
- 黑马程序员_多线程练习
- 黑马程序员_异常练习
- 黑马程序员_<<String练习>>
- 黑马程序员_<<List练习>>
- 黑马程序员_<<TCP练习>>
- 黑马程序员_多线程之死锁
- 黑马程序员_多线程与死锁
- STM32F103 USART配置问题
- ios app推送通知详细教程二
- 使用ffmpeg实现转码样例(代码实现)
- 精图规范1.0----15 滤镜效果 Filter Effects
- sql查询字判断转换段值
- 黑马程序员_我的死锁练习
- 江西夺刀救人考生登上人民日报头版
- Windows编程 - 遍历所有进程(exe) 代码(C++)
- 精图规范1.0----16 交互性 Interactivity
- boost中serialization模块的单体类
- Android Studio VS Eclipse (还在用Eclipse?你OUT了!)
- Linux下安装maven
- ffmpeg 实现转码一个普通视频文件为视频mpeg4,音频mp3的功能的程序(摘)
- 精图规范1.0----17 链接 Linking