Java线程理解-同步与死锁

package com.mldn;

 

class ThreadSyn implements Runnable

{

private int ticket = 5; // 一共仅有5张票

 

public void run() // 进行卖票操作

{

 

for (int i = 0; i

{

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:~$ 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线程理解-同步与死锁
本文地址:https://www.zhiletu.com/archives-72.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微