在学习线程锁中,照着书上敲了一遍代码后发现,输出结果过一会后会出现这样的问题:
源码如下:
package lam;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Station{
public static void main(String[] args) {
LThread lt=new LThread();
new Thread(lt,"窗口1").start();
new Thread(lt,"窗口2").start();
new Thread(lt,"窗口3").start();
}
}
class LThread implements Runnable{
private int tic=10;
private final Lock lock=new ReentrantLock();
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
lock.lock();
if(tic>0) {
System.out.println(Thread.currentThread().getName()+"正在发售第"+tic--+"张票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
}
当tic==0时,给当前窗口上锁了,但是,我们并没有给它释放锁
下面展示一些 内联代码片
。
while(true) {
lock.lock();
if(tic>0) {
System.out.println(Thread.currentThread().getName()+"正在发售第"+tic--+"张票");
try {
Thread.sleep(100);
System.out.println(lock);//显示锁的状态
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();
System.out.println(lock);//输出显示锁的状态
}
}
else {
//lock.unlock();
System.out.println("dd");
System.out.println(Thread.currentThread().getName());
System.out.println(lock);
break;
}
}
如图显示,当tic==0时,窗口2正在进行线程,因为没有对它释放锁,所以它是被锁住的,进程就一直在执行中。
要解决这个问题就只需要设置一个else,里面释放锁,然后用break跳出循环(一定要有break)
解决方法:
下面展示一些 内联代码片
。
public void run() {
// TODO Auto-generated method stub
while(true) {
lock.lock();
if(tic>0) {
System.out.println(Thread.currentThread().getName()+"正在发售第"+tic--+"张票");
try {
Thread.sleep(100);
System.out.println(lock);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();
System.out.println(lock);
}
}
else {
lock.unlock();
break;
}
}
}