在做多线程 同步时,使用Lock锁实现同步。以买票的例子。把线程休眠的时间放在 加锁Lock.lock()前,每个线程都能运行买票。启动3个线程
代码
package com.example.demo.therad.synchronizedThread;
//买票
import java.util.concurrent.locks.ReentrantLock;
public class BuyTicket implements Runnable{
private int ticketNum=10;//票数
Boolean flag=true;//线程外部结束标志
private final ReentrantLock lock=new ReentrantLock();
public void run() {
while(flag) {
try {
**Thread.sleep(1000);**
lock.lock();//加锁
if (ticketNum<=0) {
flag=false;
return;
}
System.out.println(Thread.currentThread().getName()+"买到了第:"+ticketNum-- +"张票");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();//解锁
}
}
}
}
运行结果:线程3买到了第:10张票
线程2买到了第:9张票
线程1买到了第:8张票
线程2买到了第:7张票
线程3买到了第:6张票
线程1买到了第:5张票
线程3买到了第:4张票
线程2买到了第:3张票
线程1买到了第:2张票
线程2买到了第:1张票
但是 把线程休眠的时间放在 加锁Lock.lock()后,运行的结果,只有一个线程在运行买票
代码
package com.example.demo.therad.synchronizedThread;
//买票
import java.util.concurrent.locks.ReentrantLock;
public class BuyTicket implements Runnable{
private int ticketNum=10;//票数
Boolean flag=true;//线程外部结束标志
private final ReentrantLock lock=new ReentrantLock();
public void run() {
while(flag) {
try {
lock.lock();//加锁
if (ticketNum<=0) {
flag=false;
return;
}
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"买到了第:"+ticketNum-- +"张票");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();//解锁
}
}
}
}
结果
线程2买到了第:10张票
线程2买到了第:9张票
线程2买到了第:8张票
线程2买到了第:7张票
线程2买到了第:6张票
线程2买到了第:5张票
线程2买到了第:4张票
线程2买到了第:3张票
线程2买到了第:2张票
线程2买到了第:1张票
求解答一下疑问.. 感谢