黑马程序员技术交流社区
标题:
请帮我加个同步吧
[打印本页]
作者:
逍遥呆
时间:
2014-9-26 15:43
标题:
请帮我加个同步吧
本帖最后由 逍遥呆 于 2014-9-26 15:55 编辑
我混乱了,怎么加都不对,总是出几个一号票,有时候还多一张票,是什么问题,还请指点下。
public class Test7 {
public static void main(String[] args)
{
//开启5个窗口买票
new Thread(new SealWindow("1号售票窗口")).start();
new Thread(new SealWindow("2号售票窗口")).start();
new Thread(new SealWindow("3号售票窗口")).start();
new Thread(new SealWindow("4号售票窗口")).start();
new Thread(new SealWindow("5号售票窗口")).start();
}
}
class Ticket//设置Ticket属性只有id
{
private int id;
Ticket(int id)
{
this.id = id;
}
public int getId()
{
return id;
}
}
class TicketSealCenter
{
private int totalTickets = 100;//一共有100张票
private static ArrayList<Ticket> al = new ArrayList<Ticket>();
//只有一个售票中心,所以用单例设计模式返回售票中心的对象。
private TicketSealCenter(){
for(int id = 1;id<=totalTickets;id++)//给每个票加上号码
{
Ticket tic = new Ticket(id);
al.add(tic);//将有编号的票全部存入集合中
}
};
private static TicketSealCenter tsc = new TicketSealCenter();
public static TicketSealCenter getTicketSealCenter()
{
return tsc;//返回售票中心的单例对象
}
//得到一个装着所有票的集合
public ArrayList<Ticket> getAllTickets()
{
return al;
}
}
class SealWindow implements Runnable
{
String name = null;
Object obj = new Object();
TicketSealCenter tsc = TicketSealCenter.getTicketSealCenter();
ArrayList<Ticket> al = tsc.getAllTickets();
SealWindow(String name)//传入窗口的名字
{
this.name = name;
}
@Override
public void run() {
Iterator<Ticket> it = al.iterator();
while(it.hasNext())
{
Ticket t = al.remove(0);
int num = t.getId();
System.out.println(this.name+""+num);
}
}
}
复制代码
作者:
华谦
时间:
2014-9-26 16:02
看的有点、。:lol
作者:
zuochbd
时间:
2014-9-26 16:16
本帖最后由 caixingke 于 2014-9-26 16:17 编辑
眼眯有点难受, 代码我就不看了.
总之, 如何确定临界资源?
共享资源就是临界资源来加同步就可以了.
临界区最好是放在共享资源的类定义中比较好, 因为这样封装性好. ---我的个人浅见.----------
什么是"临界区"? 什么是 "临界资源"?
这个东西是操作系统原理里面会讲的...
作者:
谢建平
时间:
2014-9-26 16:23
没认真看 你这情况明显是操作共享数据不同步 还有就是 ArrayList是不同步的 你想同步去用Collections 工具类弄个同步的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2