1.在以上中,使用synchronized我们使用同步方法和同步代码块将线程安全问题锁住,每次只能执行一个线程,但我们并不知道它是何时上锁的,何时解锁的,这里我们将使用Lock锁。
2.Lock锁是在Current.Lock包下的,是一个接口,我们需要实现ReentrantLock。
3.使用Lock方法上锁,写在线程安全问题代码的前面,Unlock放在线程安全问题代码的后面。
**
*
* @author jianyeli
*/
public class Runnableimpl implements Runnable {
public int ticket= 100;
Lock l = new ReentrantLock();
@Override
//设置线程任务
public void run() {
while(true){
//上锁
l.Lock();
if(ticket>0){
try{
Thread.sleep(millis:10);
System.out.println(Thread.currentThread().getName()+"正在卖---->"+ticket+"张票");
ticket--;
}catch(InterruptedException e){
e.printStackTrance();
}finally{
//解锁
l.unlock();
}
}
}
}
}
public class TestRunnableimpl1 {
public static void main(String[] args) {
Runnableimpl t = new Runnableimpl();
Thread m1 = new Thread(t);
Thread m2 = new Thread(t);
Thread m3 = new Thread(t);
//开启多个线程任务
m1.start();
m2.start();
m3.start();
}
}
以下是部分结果
出现执行线程时读取的数据相同
Thread-0正在卖---->100张票
Thread-1正在卖---->100张票
Thread-1正在卖---->97张票
Thread-1正在卖---->96张票
Thread-1正在卖---->95张票
Thread-1正在卖---->94张票
Thread-1正在卖---->93张票
Thread-1正在卖---->92张票
Thread-1正在卖---->91张票
Thread-1正在卖---->90张票
Thread-1正在卖---->89张票
Thread-1正在卖---->88张票