2014-10-17 6 views
0

Я не могу понять, как это сделать. У меня есть это ограничение:синхронизировать чтение переменной

  • в большинстве 5 потоков одновременно может прочитать переменную, остальные должны держать в засаде, пока переменная не может быть прочитана снова.
public void methodA() { 
    lockI.lock(); 
    try { 
     while (countIreaders == 5 || modify) { 
      conditionI.await(); 
     } 
     countIreaders++; 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } finally { 
     if (condition) { 
      countIreaders = 0; 
      lockI.unlock(); 
      conditionI.notifyAll(); 
     } else { 
      lockI.unlock(); 
     } 
    } 
} 

С помощью этого кода я сделал это серийным, но это не то, что я хочу достичь. Как я могу изменить код?

+0

Почему вы устанавливаете 'countIreaders' в 0 в своем блоке finally? – yunandtidus

+0

Я не понимаю. –

+0

Не могли бы вы объяснить, почему важно, сколько читателей читает? – Arkadiy

ответ

5

Я действительно не понимаю ваш код, но кажется, что ваш поиск Semaphore. Семафор полезен для синхронизации потоков. Вы можете создать новый семафор с 5 жетонами/разрешениями. например:

Semaphore sem = new Semaphore(5); //initialization in your data structure 

//... 

public void yourThreadFunction() { 
    // [...] in your readers threads: 
    // each thread will of course have to use the same semaphore 
    // A thread must aquire a token from the semaphore before accessing your variable 
    sem.aquire(); //this call hangs until a permit is available 
    // read your value and do some computation 
    // only 5 threads can be inside this part because of the aquire 
    sem.release(); // release the token/permits 
} 
Смежные вопросы