Java线程理解-同步与死锁
package com.mldn;
class ThreadSyn implements Runnable
{
private int ticket = 5; // 一共仅有5张票
public void run() // 进行卖票操作
{
for (int i = 0; i < 50; i++) // 循环50次,确保ticket卖完
{
if (this.ticket > 0)
{
System.out.println(Thread.currentThread().getName() + “判断完毕,ticket = ” + this.ticket + “确认还有票,将进行卖票操作!”);
try
{
Thread.sleep(2000); // 延迟操作2秒,使判断 与 操作 之间产生明显的延迟
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + “正在卖票: ticket = ” + this.ticket–);
}
}
}
}
public class SynLater
{
public static void main(String[] args)
{
ThreadSyn th = new ThreadSyn();
new Thread(th, “票贩子A”).start();
new Thread(th, “票贩子B”).start();
new Thread(th, “票贩子C”).start();
}
}
/*
administrator@xu-desktop:~$ java com.mldn.SynLater
票贩子A判断完毕,ticket = 1确认还有票,将进行卖票操作!
票贩子B判断完毕,ticket = 1确认还有票,将进行卖票操作!
票贩子C判断完毕,ticket = 1确认还有票,将进行卖票操作!
票贩子A正在卖票: ticket = 5
票贩子A判断完毕,ticket = 2确认还有票,将进行卖票操作!
票贩子B正在卖票: ticket = 4
票贩子B判断完毕,ticket = 2确认还有票,将进行卖票操作!
票贩子C正在卖票: ticket = 3
票贩子C判断完毕,ticket = 2确认还有票,将进行卖票操作!
票贩子B正在卖票: ticket = 2
票贩子B判断完毕,ticket = 3确认还有票,将进行卖票操作!
票贩子A正在卖票: ticket = 1
票贩子C正在卖票: ticket = 0
票贩子B正在卖票: ticket = -1
可见,同步执行的多个线程,在其判断与操作之间是有延迟的;判断到操作的空档,别的线程可能已经进行了修改操作,而该线程还以判断的数据进行操作,实际上操作已经不在合法了。
这说明多线程对同一内存操作时,需要加锁,一个线程操作的同一时间不允许其他线程插足!
*/
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Java线程理解-同步与死锁》
本文地址:http://www.xiupu.net/archives-72.html
关注公众号:
微信赞赏
支付宝赞赏