2012-05-30 2 views
0

У меня есть веб-приложение, в котором используются некоторые баночки, написанные мной. Моя проблема в том, что у меня есть критический (но быстрый) раздел в моем коде.Java Threads and synchronization

1 - У меня есть объект данного класса, который имеет пару полей static. Назовем этот класс A

2 _ A предоставляет не статический метод, который обращается к полям static. для чтения и письма. Позволяет называть этот метод doJob.

3 - Каждый запрос создает экземпляр объекта класса A и вызывает doJob.
A a = new A(); a.doJob();

4 - Я полагаю, что каждый запрос создает новый Thread где doJob выполняется.

5 - Если я определяю doJob как public synchronized void doJob() {//Do the job}, то только один Thread в то время будет выполнять метод, а остальные будут продолжать ждать.

Вопрос в следующем: все в порядке, что я говорю?

+0

Экземпляры объектов не имеют ничего общего с синхронизацией (за исключением того, что некоторые экземпляры могут использоваться и отображаться только в контексте X). Я думаю, что есть Java Trail для этого ... –

ответ

1

Вы правы, но doJob будет синхронизироваться на уровне экземпляра, поэтому метод doJob может быть выполнен в одно и то же время двумя или более разными потоками в двух или более экземплярах класса A. Если вы хотите, чтобы doJob выполнялся только по одному потоку за раз (например, потому что он выполняет статические поля), вы должны либо объявить его статическим, либо синхронизировать тело всего метода, используя статическое поле в качестве объекта блокировки.

0

Учитывая, что вы пытаетесь защитить статические (то есть одно для каждого класса) поля с нестационарным (то есть одним на объект) монитором, я бы сказал, что «только один поток за раз будет выполнять метод и другие будут продолжать ждать "претензии не имеют.

+0

Привет alf и спасибо за ваш ответ. Что добавляет другое статическое поле и где-то в синхронизированном методе (статическое поле) {// Выполняем работу} спасибо – mdev

+0

mdev, это один из возможных подходов. В целом, однако, хотелось бы думать о целях и гарантиях, а не о деталях низкого уровня; поскольку мы не знаем ваших целей, я не могу сказать, подходит ли это или нет. – alf

0

No.

Маркировка метод экземпляра как synchronized означает то же самое, что делает

public void myMethod() { 
    synchronized(this) { 
    ... 
    } 
} 

Таким образом, вы можете гарантировать, что только две нити не работает тот же метод одного и того же объекта. Один и тот же метод из другого объекта может запускаться одновременно.

Попробуйте синхронизировать с более «статическим» объектом. Я бы использовал сам объект класса или некоторый статический (и не подлежащий использованию) член.

+0

Hi SJuan76. Кажется, я понимаю, что ты говоришь.было бы какое-то статическое поле в классе, называемом syn, а затем public void myMethod() { synchronized (syn) { ... } } Большое спасибо. – mdev

+0

Да, это должно быть так. – SJuan76

0

Да, вы контурный. и это технически является узким местом системы, в то время как другие потоки ждут доступа. и это совершенно нормально и нормально, если вы избегаете ввода какой-либо тяжелой обработки или ввода-вывода в синхронизированном блоке.