0

(Java 同期の問題) タイトルの通り、同期ブロック内の静的変数にアクセスできますか? 不整合の原因になりますか?静的変数同期ブロックにアクセスすることの欠点または利点の詳細を教えてください。

4

1 に答える 1

4

同期ブロックの静的変数にアクセスできますか?

はい、できます。

不整合の原因になりますか?

静的とは、JVM 内のそのクラスのすべてのインスタンスで共有されることを意味します。共有リソースはスレッドセーフではありません。したがって、静的変数はスレッドセーフではありません。そのため、複数のスレッドが静的変数にアクセスしようとすると、矛盾が生じる可能性があります。

私が知っている静的変数へのアクセスを同期する方法。

  1. 静的オブジェクトで同期します。

       public class SomeClass{
          private static int sum = 0;
          private static final Object locker = new Object();
    
          public void increaseSum() {
               synchronized (locker) {
               sum++;
          }
        }
      }
    
  2. 同期静的メソッド。

    public class SomeClass {
        private static int sum = 0;
    
       public static synchronized void increaseSum() {
         sum++;
     }
    }
    
  3. クラス オブジェクトで同期する

     public class SomeClass {
        private static int sum= 0;
    
        public void increaseSum() {
           synchronized (SomeClass .class) {
           sum++;
         }
       }
     } 
    
于 2013-04-28T15:15:52.833 に答える