поток / синхронизация в Java - PullRequest
2 голосов
/ 04 марта 2012

Я очень разочарован в Java за то, что не позволил следующему коду перемещаться так же быстро, как мог. Когда синхронизация отсутствует, два потока переключаются чаще, но при попытке доступа к синхронизированному методу потребуется слишком много времени (например, 30 секунд), прежде чем второй поток получит блокировку, и снова, прежде чем первый поток получит блокировку со второго. Какая кодировка может помочь лучше разделить блокировку:

   public synchronized static void i()
   {

     System.out.println(Thread.currentThread().getName());

    }
    public static void main(String[] f)
   {

   Thread t = new Thread(new Runnable(){
    public void run()
   {
       while(true)
       i();
     }});
    t.setName("a: ");
    Thread t2 = new Thread(new Runnable(){
     public void run()
     {
       while(true)
        i();
      }});
      t2.setName("b: ");
      t.start();
      t2.start();

    }

Ответы [ 2 ]

7 голосов
/ 04 марта 2012

Используйте ReentrantLock с честностью, установленной в true.

public static final ReentrantLock lock = new ReentrantLock(true);
public static void i()
{
    lock.lock();
    try {
        System.out.println(Thread.currentThread().getName());

    } finally {
        lock.unlock();
    }
}
3 голосов
/ 04 марта 2012

Проблема не в Java, а в вашем коде. Какая часть контракта на блокировку подразумевает справедливое приобретение? Это НАМНОГО быстрее и эффективнее для того, чтобы просто позволить существующему держателю замка продолжаться; обычно они заканчивают свою работу и все равно снимают замок. Ваша программа должна сделать 0 предположений о справедливости блокировок и чередовании потоков.

Если вы хотите справедливое чередование, вам не следует использовать синхронизированные методы. Вам нужно будет создать частный объект, а затем вручную использовать методы wait () и notify () для этого частного объекта для принудительного чередования, но даже тогда это предположение :) volatile условная переменная, указывающая, чья очередь исполнять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...