2 zhoujay0755 zhoujay0755 于 2014.11.07 22:30 提问

java多线程同步问题,小弟百撕不得其解,特来求助!

多线程共享同一资源,同一张票卖出了多张!同步方法,同步代码块都没用。
问题:编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。
public class ThreadDemo {
public static void main(String[] args) {
Thread t1 = new Thread(new SealWindow(),"1号售票窗口");
Thread t2 = new Thread(new SealWindow(),"2号售票窗口");
Thread t3 = new Thread(new SealWindow(),"3号售票窗口");
Thread t4 = new Thread(new SealWindow(),"4号售票窗口");
Thread t5 = new Thread(new SealWindow(),"5号售票窗口");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}

}

class Ticket {
private int id;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

}

class SealWindow implements Runnable {
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
sellTicket();
}

public synchronized void sellTicket() {
    TicketSealCenter tsc = TicketSealCenter.getInstance();
    List<Ticket> tickets = tsc.getTickets();
    while (!tickets.isEmpty()) {
        Iterator<Ticket> it = tickets.iterator();
        Ticket ticket = it.next();
        System.out.println(Thread.currentThread().getName() + "...."
                + "卖了一张票,id为" + "..." + ticket.getId());
        tickets.remove(ticket);
    }
}

}

// 只有一个售票中心,所以把它设置成单例
class TicketSealCenter {
private static List tickets = new ArrayList();
private int ticketNum = 100;

private TicketSealCenter() {
    // 给每张票设置一个唯一的ID号
    setIdToTicket(tickets);
}

private static TicketSealCenter tsc = new TicketSealCenter();

// 提供一个公有方法,获取售票中心对象
public static TicketSealCenter getInstance() {
    return tsc;
}

private void setIdToTicket(List<Ticket> tickets2) {
    for (int i = 1; i <= ticketNum; i++) {
        Ticket ticket = new Ticket();
        ticket.setId(i);
        tickets.add(ticket);
    }
}

public List<Ticket> getTickets() {
    return tickets;
}

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
手撕代码(三)Java多线程模拟生产者消费者方法
一时兴起,写个多线程模拟生产者消费者的例子,本来应该更新堆排序的,那就晚上再更吧,最近有点忙呀。下面是我提供的代码,都是手敲的呀,不过没给大家提供导入的包文件,喜欢的朋友,复制黏贴过去然后编译器自然会导入的。最近好忙,看不到目标,继续往前好了 public class SXThread{ public static void main(String[] args){ SXThread
Java 多线程同步问题的探究-经典讲解
Java 多线程同步问题的探究(五、你有我有全都有—— ThreadLocal如何解决并发安全性?)【更新重要补疑】Java 多线程同步问题的探究(四、协作,互斥下的协作——Java多线程协作(wait、notify、notifyAll))Java 多线程同步问题的探究(三、Lock来了,大家都让开【2. Fair or Unfair? It is a question...】)Java
撕美女衣服应用的原理及做法
现在教大家做一款在市场上非常火的的应用,撕美女衣服。其实原理很简单: 1.准备两张一样的图片,一张是穿有衣服的,另一张是没有穿衣服的。 2.通过FrameLayout进行布局,穿衣服的放上面,没穿衣服的图片放下面。 3.通过触摸事件进行判断,手指划过的地方,让穿衣服的图片变成透明,就显示到了下面没穿衣服的图片。 这样效果就形成了。先让大家看一下效果图: 撕衣服之前: 撕衣服之后:
百钱买百鸡问题(附java源代码)
package oj.test; import java.util.Scanner; public class Demo19 {  /**   * @百钱买百鸡问题   * 公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。   * 百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?   */  public static vo
JAVA学习初步:百鸡百钱问题算法解及暴力解
百鸡百钱问题的算法解法及暴力解法 算法解的公式推导:x+y+z=100,5x+3y+z/3=100;由于x最贵则x的取值范围最小,用x分别表示x,y.得:y=25-(7/4)*x,z=75+(3/4)*x;令x=4k.得y=25-7k,z=75+3k;
java多线程同步分析
java多线程同步分析java多线程同步分java多线程同步分析析java多线程同步分析java多线程同步分析
利用JAVA实现“百鸡百钱”问题
题目:公鸡5元一只,母鸡3元一只,3只小鸡1元,如果用100元钱,买100只鸡,不佘不欠,可以买公鸡,母鸡,小鸡,各多少只。分析这个问题可以说是高级语言中的经典问题了,利用简单的算法和逻辑来解决简单的数学问题是可以用基本语法可以解决的。我们先假设都买公鸡,100元最多只能买20只公鸡,绝对不可能达到100只。假如100元都买母鸡,最多只能买到33.333333333333…..只母鸡(可怜最后的三分
java线程同步问题——由腾讯笔试题引发的风波
刚刚wm问我了一道线程的问题,由于自己一直是coder界里的渣渣,所以就需要恶补一下。 1,基础知识 线程的等待与唤醒 /** * Created by xk on 2016/4/2. */ public class WaitTest { public static void main(String[] args) { ThreadA t1 = new Threa
Java经典算法——百钱百鸡
题目: 公鸡5文钱1只,母鸡3文钱1只,小鸡3只1文钱,用100文钱买100只鸡,可以怎么买? public class BQBJ { public static void main(String[] args) { /* 公鸡五文一只,母鸡三文一只,小鸡三只一文,用一百文,买一百只 */ int
利用Java的类加载机制,来变相的解决多线程访问的问题
/**  * 利用Java的类加载机制,来变相的解决多线程访问的问题。  *  * @author Administrator  *  */ public class Singleton {     private static class Holder {         private static final Singleton instance = new Single