Java Multithreading - Threadsafe Counter

前端 未结 4 2056
借酒劲吻你
借酒劲吻你 2020-12-28 08:27

I\'m starting off with a very simple example in multithreading. I\'m trying to make a threadsafe counter. I want to create two threads that increment the counter intermitten

4条回答
  •  误落风尘
    2020-12-28 09:22

    Well, with your code I don't know how to get "exactly" intermittently, but if you use Thread.yield() after call incrementCounter() you will have a better distribution.

    public void run() {
             while(counter<1000){
                  incrementCounter();
                  Thread.yield();
    
             }
        }
    

    Otherwise, to get what you propose, you can create two different thread class (ThreadsExample1 and ThreadsExample2 if you want), and another class to be a shared variable.

    public class SharedVariable {
        private int value;
        private boolean turn; //false = ThreadsExample1 --> true = ThreadsExample2
    
        public SharedVariable (){
            this.value = 0;
            this.turn = false;
        }
    
        public void set (int v){
            this.value = v;
        }
    
        public int get (){
            return this.value;
        }
    
        public void inc (){
            this.value++;
        }
    
        public void shiftTurn(){
            if (this.turn){
                this.turn=false;
            }else{
                this.turn=true;
            }
        }
    
        public boolean getTurn(){
            return this.turn;
        }
    
    }
    

    Now, the main can be:

    public static void main(String[] args) {
            SharedVariable vCom = new SharedVariable();
            ThreadsExample1 hThread1 = new ThreadsExample1 (vCom);
            ThreadsExample2 hThread2 = new ThreadsExample2 (vCom);
    
            hThread1.start();
            hThread2.start();
    
            try {
                hThread1.join();
                hThread2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    

    And you have to change your line static int counter = 1; // a global counter for private SharedVariable counter;

    And the new run is:

    public void run() {
        for (int i = 0; i < 20; i++) {
            while (!counter.getTurno()){
                Thread.yield();
            }
            System.out.println(this.counter.get());
            this.counter.cambioTurno();
        }
    }
    

    }

    Yes, it is another code, but I think it can help you a little bit.

提交回复
热议问题