2015-07-31 3 views
0

Если я не использую какие-либо сеттеры/геттеры в моем классе java. Когда поток A имеет блокировку уровня класса моего класса X. Может ли другой поток B напрямую изменить статическую переменную? ?Блокировка уровня класса для статических переменных в java

public class X { 

    Integer static_variable = 10; 

    public static void doNothing { 
     /* Do Nothing */ 
    } 

} 

Скажем, нить A теперь имеет блокировку уровня. Могу ли я сделать X.static_variable = 11 из другого потока B?

Я писал код, чтобы получить тупик в java.

общественный класс А реализует Runnable {

public static Integer as = 5; 
    static A a = new A(); 
    static B b = new B(); 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    // TODO code application logic here 

    Thread thread1 = new Thread(a); 
    Thread thread2 = new Thread(b); 
    thread1.setName("First"); 
    thread2.setName("Second"); 
    thread1.start(); 
    thread2.start(); 
} 


public void run() {  
    runme(); 

}

public static synchronized void runme() { 
    try { 
    System.out.println(Thread.currentThread().getName() + " has object a's key and waiting"); 
    Thread.sleep(1000); 
    System.out.println(Thread.currentThread().getName() + " Woke up from sleep"); 
    System.out.println(Thread.currentThread().getName() + " wants b's Key"); 

    B.bs = 10; 
    System.out.println(Thread.currentThread().getName() + " over"); 

    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

}

общественного класса B реализует Runnable {

public static Integer bs = 6; 

public void run() { 
    runme(); 
} 

public static synchronized void runme() { 
    try { 
     System.out.println(Thread.currentThread().getName() + " has object b's key and waiting"); 
     Thread.sleep(1000); 
     System.out.println(Thread.currentThread().getName() + " Woke up from sleep"); 
     System.out.println(Thread.currentThread().getName() + " wants a's Key"); 

     A.as = 10; 
     System.out.println(Thread.currentThread().getName() + " over"); 

    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

} 

}

Но получить результат ниже:

Второй имеет ключевой объект Б и ждет Первый имеет объект А вот ключ и ждет Первый Проснулся от сна Второй просыпался от сна Второй хочет это ключ Второй над Первая хочет Key Сначала над

Второй поток Б явно редактирования статической переменной класса А, даже если другой поток удерживает блокировку на уровне класса класса А

ответ

1

Да, вы можете. Если у вас нет синхронизированный блок вокруг изменяемого значения кода. Если вы не используете синхронизацию, другие темы не должны приобретать монитор X.class, прежде чем изменять его static_variable.

Сделать поле private и добавить setter, сделать его синхронизированы, то вы не сможете изменить поле, когда другой поток удерживает блокировку для X.class

Смежные вопросы