Sharing a variable between multiple different threads

前端 未结 6 1899
长发绾君心
长发绾君心 2020-12-01 12:33

I want to share a variable between multiple threads like this:

boolean flag = true;
T1 main = new T1();
T2 help = new T2();
main.start();
help.start();
         


        
6条回答
  •  醉酒成梦
    2020-12-01 13:12

    You can use lock variables "a" and "b" and synchronize them for locking the "critical section" in reverse order. Eg. Notify "a" then Lock "b" ,"PRINT", Notify "b" then Lock "a".

    Please refer the below the code :-

    public class EvenOdd {
    
    static int a = 0;
    
    public static void main(String[] args) {
    
        EvenOdd eo = new EvenOdd();
    
        A aobj = eo.new A();
        B bobj = eo.new B();
    
        aobj.a = Lock.lock1;
        aobj.b = Lock.lock2;
    
        bobj.a = Lock.lock2;
        bobj.b = Lock.lock1;
    
        Thread t1 = new Thread(aobj);
        Thread t2 = new Thread(bobj);
    
        t1.start();
        t2.start();
    
    }
    
    static class Lock {
        final static Object lock1 = new Object();
        final static Object lock2 = new Object();
    }
    
    class A implements Runnable {
    
        Object a;
        Object b;
    
        public void run() {
            while (EvenOdd.a < 10) {
                try {
                    System.out.println(++EvenOdd.a + " A ");
                    synchronized (a) {
                        a.notify();
                    }
                    synchronized (b) {
                        b.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
        }
    }
    
    class B implements Runnable {
    
        Object a;
        Object b;
    
        public void run() {
            while (EvenOdd.a < 10) {
    
                try {
                    synchronized (b) {
                        b.wait();
                        System.out.println(++EvenOdd.a + " B ");
                    }
                    synchronized (a) {
                        a.notify();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
        }
    }
    

    }

    OUTPUT :- 1 A 2 B 3 A 4 B 5 A 6 B 7 A 8 B 9 A 10 B

提交回复
热议问题