2013-09-17 8 views
3

Скажем, у меня есть класс, определенный как:Блокировать статические методы?

public class MyClass { 

    private static int data; 

    public static staticMethod(int val){ 
     ... do something with data based on val ... 
    } 
} 

А теперь у меня есть много Java потоков, выполняющихся в моем приложении, которые делают вызовы к статическому методу

MyClass.staticMethod(int) 

Будет ли метод блочного на каждый вызов? то есть, если поток 1 вызывает метод первым, и пока этот запуск метода выполняется, поток 2 вызывает статический метод, будет ли второй поток ждать до завершения первого выполнения?

Если ответ отрицательный, тогда, когда имеет смысл использовать статические элементы данных несинхронизированным образом?

+3

Почему бы вам не попробовать и не посмотреть? – SevenBits

+4

@SevenBits, потому что проблемы параллелизма часто не проявляются до тех пор, пока не возникнет высокая конкуренция, поэтому усилия по их устранению по дизайну часто будут платить за себя. Этот подход «попробуйте и посмотрите», чтобы понять технические характеристики, приводит к тому, что код работает до тех пор, пока это не будет иметь значения. –

+1

До сих пор довольно просто попробовать это и посмотреть, что произойдет. –

ответ

3

Будет блочный метод при каждом вызове?

No. A plain static метод не блокирует другие темы. (Но метод static synchronized может блокировать другие потоки ... или блокироваться другими потоками.)

Если ответ нет, то когда бы это имеет смысл использовать статические элементы данных в не- «синхронизируется» путь?

  • Это нормально, если член данных, если член volatile ... по модулю пределы изменчивы.

  • Это нормально, если элемент данных является ссылкой final на потокобезопасный тип.

  • Это нормально, если элемент данных ограничен потоком.

  • Это нормально, если что-то еще занимается синхронизацией, или если вы используете объекты для взаимного исключения и т. Д., Хотя вы, вероятно, сказали бы, что эти «не считаются».

7

Нет, это не относится к ключевому слову static. Если вы хотите синхронизировать два потока, обращаясь к одному и тому же методу, используйте другие возможности, такие как synchronized (method или statement) или материал из пакета java.util.concurrent.

3

Как вы его написали, нет. Несколько потоков не будут блокироваться, пока другой поток не завершит выполнение метода. Это верно независимо от того, является ли метод static.

Чтобы обеспечить, чтобы только один поток имел доступ к методу, вы должны сделать метод synchronized.

public static synchronized staticMethod(){ 
Смежные вопросы