public class ThreadDemo4t
no usages
public static void main(StringL]args)
yyRunnabLe5mr=new MyRunnable5C
Threadt=newThread(mr,name:"一号选手")
Threadt1=newThread(mr,name:"二号选手")
t1.start()
t.startO);
2usages
cLass MyRunnable5implements Runnable
4usages
orivateintticket=10
QOverride
public void runC) T
while(ticket>0)
BuyO);
1 usage
public void BuyC)
while(ticket>0)
synchronized(this)
while(ticket>){
if(ticket>)
System.out.printin(Thread.currentThreadC).getNameC)+"买到了第"+ticket+"张票");
ticket--
try
Thread.sLeepC millis: 1000)
catch(InterruptedExceptione)
thrownewRuntimeException(e)
为什么while判断如果在synchronized里面,第二个线程就不运行,放在外面,就可以运行,求解
你用笨理想啊
假如有很多个人在处理快递,但是仓库一次只能允许一个人进入
那你是先告诉所有人循环执行任务,轮到谁去拿快递,谁就把门锁好,等他出来下一个人再进
还是一个人先进去把门锁上,然后他自己一直在不停的拿快递
结果能一样吗
"如果在synchronized里面,第二个线程就不运行" -- 因为它被阻塞了。在 synchronized 块内部只有一个线程能够被执行。即使有多个线程同时运行到了 synchronized 块,也只有一个线程能够进入块并占有锁(即在此期间不能被其他线程占用)。因此,当第一个线程进入块并占有锁时,第二个线程会被阻塞,直到第一个线程执行完 synchronized 块并释放锁为止。
另外需要注意,变量 ticket 是多个线程共享的,因此在访问时应该使用同步措施来保证线程安全。否则,可能会出现不同线程之间的竞争条件,导致程序出现异常或者结果不正确。
同步代码块 synchronized,如果 是 A线程先获取锁,那就要等 A执行完,其他的线程 才能占有锁,并继续执行;