【问题标题】:Usage of binary semaphore - not working correctly (Selling tickets)二进制信号量的使用 - 无法正常工作(售票)
【发布时间】:2013-07-27 00:28:04
【问题描述】:

我正在尝试实现一个简单的问题,我有一个全局变量来出售门票。 我产生了 3 个线程来出售 10 张门票,而我正在使用二进制信号量进行此操作。

private static int noOfTickets =10;
private static boolean soldAll = false;
private static Random r = new Random(10);

/************ MAIN **************/
public static void main(String[] arg){
    // spawn 10 threads to see a tickets

    for(int i =0; i<3; i++){
        Thread t = new Thread(new sellRunnable());
        t.setName("Me_"+i);
        t.start();
    }
}
/************ MAIN **************/


public static void sell() throws InterruptedException{
    Semaphore b = new Semaphore(1);
    int numOfTicketsSoldByThisThread = 0;
    while(!soldAll){

        addRandomDelay(1000, 100);

        b.acquire();
        if(noOfTickets>0){
            Thread t = Thread.currentThread();
            numOfTicketsSoldByThisThread++;
            noOfTickets--;
            System.out.println("I "+t.getName()+" sold "+numOfTicketsSoldByThisThread+"ticket. tickets left are "+noOfTickets);


        }else{
            soldAll = true;
            System.out.println(" sold all tickets");
        }
        b.release();
    }// end of while


}

public static class sellRunnable implements Runnable{

    public void run() {
        try {
            sell();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

当我运行这段代码时,有时我没有得到正确的输出 我明白了

  • I Me_2 卖出了 1 张票。还剩 7 张票
  • I Me_1 卖出了 1 张票。还剩 7 张票

注意,两个线程是如何打印出剩余票数为 7 的?这不可能吧?我知道 noOfTicketsLeft-- 不是原子操作,但它在信号量内部。那么,它应该有效吗?

【问题讨论】:

    标签: java multithreading semaphore atomic


    【解决方案1】:

    您需要为所有三个线程使用相同的 Semaphore 实例。就目前而言,它们都指向不同的信号量,因此它们实际上并没有相互锁定。

    顺便说一句,尽管这看起来可能只是为了快速练习,但您确实应该改掉使用静态变量的习惯;声明一个类,然后实例化它并在 main() 中调用它。不用花太多力气,而且干净得多。

    【讨论】:

    • 我同意。我刚刚删除了所有静态变量。感谢您注意到我的错误!现在可以了。
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多