Rumah  >  Soal Jawab  >  teks badan

并发 - Java static / non-static synchronized方法同时修改static成员变量,会有问题吗?

阿神阿神2763 hari yang lalu539

membalas semua(1)saya akan balas

  • 迷茫

    迷茫2017-04-18 10:39:15

    Rujuk soalan StackOverflow:

    http://stackoverflow.com/ques...

    Walau bagaimanapun, saya masih mempunyai banyak perkara untuk diperkatakan, jadi sila berikan saya nasihat dan perbincangan anda!


    Tambahan:

    Jalankan program ujian berikut, keputusan akhir bukan 20000, hasilnya ditimpa berkali-kali di tengah.

    public class Test {
        
        private static int staticVariableOne = 0;
    
        public Test() {
            super();
        }
        
        public static int getStaticVariableOne() {
            return staticVariableOne;
        }
    
        public static void setStaticVariableOne(int staticVariableOne) {
            Test.staticVariableOne = staticVariableOne;
        }
        
        private static void increaseStaticVariableOne() {
            staticVariableOne++;
        }
        
        public synchronized void add() {
            System.out.println("执行 add() 开始...");
            try {
                for (int i  = 0; i < 10000; i++) {
                    increaseStaticVariableOne();
                    Thread.sleep(1);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("执行 add() 完毕...");
        }
     
        public synchronized static void addStatic() {
            System.out.println("执行 addStatic() 开始...");
            try {
                for (int i  = 0; i < 10000; i++) {
                    increaseStaticVariableOne();
                    Thread.sleep(2);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("执行 addStatic() 完毕...");
        }
    
    }
    public class StudyMain {
        public static void main( String[] args ) {
            
            final Test insertData = new Test();
            Thread threadOne = new Thread() {
                @Override
                public void run() {
                    insertData.add();
                }
            };
            
            Thread threadTwo = new Thread() {
                @Override
                public void run() {
                    Test.addStatic();
                }
            };
            
            threadOne.start();
            threadTwo.start();
            try {
                threadOne.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            try {
                threadTwo.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("After 20000 times increasements, final staticVariableOne is "
            + Test.getStaticVariableOne());
        }
    }

    balas
    0
  • Batalbalas