黑马程序员技术交流社区
标题:
关于线程的一个问题
[打印本页]
作者:
麻仁博
时间:
2015-4-17 23:47
标题:
关于线程的一个问题
本帖最后由 麻仁博 于 2015-4-17 23:49 编辑
/*
* 模拟一个火车站卖票程序,需求5个窗口,需要多线程完成.
*/
class Tickets implements Runnable
{
private final ReentrantLock lock = new ReentrantLock();
private String name;
Tickets(String name )
{
this.name=name;
}
@Override
public void run()
{
while(true)
{
lock.lock();
if (tic.hasNum())
{
System.out.println(name+"号窗口"+"卖出了1张票,还有票:"+tic.getNum());
}
else
{
break;
}
lock.unlock();
}
}
}
class tic
{
private static int num;
public tic(int num)
{
tic.num=num;
}
public static int getNum()
{
return --num;
}
public static boolean hasNum()
{
if (num>0)
{
return true;
}
else
{
return false;
}
}
public static void setNum(int num)
{
tic.num=num;
}
}
public class Demo29 {
public static void main(String[] args)
{
tic t=new tic(10);
new Thread(new Tickets("1")).start();
new Thread(new Tickets("2")).start();
new Thread(new Tickets("3")).start();
new Thread(new Tickets("4")).start();
new Thread(new Tickets("5")).start();
}
}
复制代码
作者:
麻仁博
时间:
2015-4-17 23:50
为什么我这里用 lock的话会有错误,首张票可能会有俩个线程一起 执行 用synchronized 就不会了。。
作者:
麻仁博
时间:
2015-4-18 14:37
额 我自己想明白了
第一个错误是 我用得锁不对 这个锁多次创建了 (这里还是有个问题 被final修饰过后,这个对象是唯一的 ,那不同的线程进来创建 是不是都有了这么一个唯一的对象)
所以多个线程用了多个锁
第二个错误 如果用synchronized 的话 执行结束 判断是否还有票 ,没有票 break了之后 锁会自动释放
但是我用lock 的话就不行,必须在break 之前 释放锁 不然其他线程结束不了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2