多线程之三
来源:互联网 发布:乎的反义词是什么 编辑:程序博客网 时间:2024/04/30 06:03
线程的死锁
哲学家进餐的问题
线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,就造成了死锁。
class TicketsSystem3
...{
public static void main(String[] args)
...{
SellThread st=new SellThread();
new Thread(st).start();
try
...{
Thread.sleep(1000);
}
catch(Exception e)
...{
e.printStackTrace();
}
st.b=true;
new Thread(st).start();
}
}
class SellThread implements Runnable
...{
int tickets=100;
Object ojb=new Object();//这个可以是任意的对象
boolean b=false;
public void run()
...{
if(b==false)
...{
while(true)
...{
sell();//同步方法利用的是this所代表的对象的锁
}
}
else
...{
while(true)
...{
synchronized(obj)
...{
try
...{
Thread.sleep(1000);
}
catch(Exception e)
...{
e.printStackTrace();
}
synchronized(this)//能实现方法和同步块同步
/** *//**静态方法只属于类本身,它并不属于某一个对象,当我们在调用静态方法的时候
并不需要产生类的对象,同步静态方法使用的是方法所在的类所对应的CLASS对象的监视器,
每个对象都有自己对应的CLASS对象*/
//synchronized(ojb)//这样的话。两个线程实现的都是ELSE里的语句,
//让线程睡眠一会可以看到结果会出现0这张票
...{
if(tickets>0)
...{
System.out.println("obj:"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
}
}
}
public synchronized void sell()
...{
synchronize(obj)
...{
if(tickets>0)
/** *//**假设第一个线程进入IF语句中,时间片刚好到期,然后第二个线程运行,进入IF语句中
时间片刚好到期,然后第三个线程运行,进入IF语句中,时间片刚好到期
然后第四个线程运行,进入IF语句中,时间片刚好到期.之后,第一个线程获得时间片,
开始运行语句,开始减减,卖了1这张票,tickets变为0,第二个线程卖了0这张票,
tickets变为-1.第三个线程卖了-1这张票,tickets变为-2,第四个线程卖了-2这张票,tickets变为-3,
让线程睡眠一下,可以捕捉结果*/
...{
try
...{
Thread.sleep(1000);
}
catch(Exception e)
...{
e.printStackTrace();
}
System.out.println("sell:"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
}
...{
public static void main(String[] args)
...{
SellThread st=new SellThread();
new Thread(st).start();
try
...{
Thread.sleep(1000);
}
catch(Exception e)
...{
e.printStackTrace();
}
st.b=true;
new Thread(st).start();
}
}
class SellThread implements Runnable
...{
int tickets=100;
Object ojb=new Object();//这个可以是任意的对象
boolean b=false;
public void run()
...{
if(b==false)
...{
while(true)
...{
sell();//同步方法利用的是this所代表的对象的锁
}
}
else
...{
while(true)
...{
synchronized(obj)
...{
try
...{
Thread.sleep(1000);
}
catch(Exception e)
...{
e.printStackTrace();
}
synchronized(this)//能实现方法和同步块同步
/** *//**静态方法只属于类本身,它并不属于某一个对象,当我们在调用静态方法的时候
并不需要产生类的对象,同步静态方法使用的是方法所在的类所对应的CLASS对象的监视器,
每个对象都有自己对应的CLASS对象*/
//synchronized(ojb)//这样的话。两个线程实现的都是ELSE里的语句,
//让线程睡眠一会可以看到结果会出现0这张票
...{
if(tickets>0)
...{
System.out.println("obj:"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
}
}
}
public synchronized void sell()
...{
synchronize(obj)
...{
if(tickets>0)
/** *//**假设第一个线程进入IF语句中,时间片刚好到期,然后第二个线程运行,进入IF语句中
时间片刚好到期,然后第三个线程运行,进入IF语句中,时间片刚好到期
然后第四个线程运行,进入IF语句中,时间片刚好到期.之后,第一个线程获得时间片,
开始运行语句,开始减减,卖了1这张票,tickets变为0,第二个线程卖了0这张票,
tickets变为-1.第三个线程卖了-1这张票,tickets变为-2,第四个线程卖了-2这张票,tickets变为-3,
让线程睡眠一下,可以捕捉结果*/
...{
try
...{
Thread.sleep(1000);
}
catch(Exception e)
...{
e.printStackTrace();
}
System.out.println("sell:"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
}
- 多线程之三
- 多线程编程之三
- 多线程编程之三
- 多线程之三:NSThread
- java多线程之三
- 多线程进阶之三
- 多线程之三:MFC多线程及实例
- 多线程之三:MFC多线程及实例
- 多线程之三:MFC多线程及实例
- 多线程之三:MFC多线程及实例
- 多线程之三:MFC多线程及实例
- C++多线程编程之三
- 多线程之三 线程通信
- iOS多线程之三 GCD
- Java基本知识之三(多线程)
- 多线程之join,interrupt(三)
- 多线程编程之三 线程间通讯
- 多线程教程之三---线程的死锁
- MD2关键帧动画
- VC6几个技巧
- 多线程之二
- A terrible day
- 子窗体刷新父窗体
- 多线程之三
- 每个人的华为都在沦陷
- C#中出现了一个问题,就是程序主窗体已经打开,在调用子窗体时候出现了创建窗口句柄时出错。
- VC 学习过程----vc++学习精髓(收集,整理) 转载自 拼搏之路
- 学生管理系统Flash浏览
- 大学这四年
- 沉淀在记忆中的糖果
- POJ 2575 Jolly Jumpers 解题报告
- 唯一可译码与即时码的判决