用线程增加静态变量

时间:2016-10-02 05:18:25

标签: java multithreading concurrency synchronization semaphore

我有很多客户都有自己的主题。我有一个cafe对象,其中包含一个最多允许5个信号量的信号量。客户在不同的时间到达和离开,因此我需要跟踪时间的流逝,客户在信号量到达时从信号量获取许可,并在信号离开时将其释放。

客户实现了runnable,在下面称之为“eat”#be;咖啡馆的方法。我已经测试过,我的计数器正在递增到达到达时间之上,但是try / catch语句没有被调用。

public void eat(Customer customer)
{

    while(true) {

        System.out.println("hello");

        if (customer.getArrivalTime() < Main.counter) {

            try {

                semaphore.acquire();
                System.out.println(customer.getName() + ' ' + customer.getArrivalTime());
                TimeUnit.SECONDS.sleep(customer.getLeavetime());
            } catch (InterruptedException iex) {
                iex.printStackTrace();
            } finally {
                //System.out.printf("Farmer %s has crossed the bridge.\n",customer.getName());
                semaphore.release();
                System.out.println(Main.counter);
                break;
            }
        }
    }
}

客户类的相关摘要

public class Customer implements Runnable{

    public void run() {
            icecream.eat(this);

}

主要

的相关摘要
 public class Main {

    static int counter = 0;
    static Timer timer;

    public static void main(String[] args) {

    //create timer task to increment counter
        TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {
            // System.out.println("TimerTask executing counter is: " + counter);
            counter++;
        }
    };

    Customer c1 = new Customer(Parlor, 5); //arrival time of 5
    Thread t1 = new Thread(c1);
    timer = new Timer("MyTimer");//create a new timer
    timer.scheduleAtFixedRate(timerTask, 1000, 1000); //start timer to increment  counter
    t1.start();

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

counter变量的更改对所有线程都不可见。要确保所有读取相同counter值的线程都必须使用volatile

static volatile int counter = 0;

有关详细信息,请参阅Atomic Accessstatic vs. volatile