Skip to content

Instantly share code, notes, and snippets.

@AppLoidx
Created August 27, 2019 23:49
Show Gist options
  • Select an option

  • Save AppLoidx/ac8cc575f9493d66bceb61090b5baab4 to your computer and use it in GitHub Desktop.

Select an option

Save AppLoidx/ac8cc575f9493d66bceb61090b5baab4 to your computer and use it in GitHub Desktop.
public class ThreadsExample implements Runnable {
static int counter = 1; // a global counter
static ReentrantLock counterLock = new ReentrantLock(true); // enable fairness policy
static void incrementCounter(){
// Using ReenterantLock for avoid starvation problem
counterLock.lock();
// Always good practice to enclose locks in a try-finally block
try{
System.out.println(Thread.currentThread().getName() + ": " + counter);
counter++;
}finally{
counterLock.unlock();
}
}
@Override
public void run() {
while(counter<1000){
incrementCounter();
}
}
public static void main(String[] args) {
ThreadsExample te = new ThreadsExample();
Thread thread1 = new Thread(te);
Thread thread2 = new Thread(te);
thread1.start();
thread2.start();
}
}
@AppLoidx

Copy link
Copy Markdown
Author

Oracle про голодание (starvation):

Starvation описывает ситуацию, когда поток не может получить регулярный доступ к общим ресурсам и не может добиться прогресса. Это происходит, когда общие ресурсы становятся недоступными в течение длительного времени "жадными" потоками. Например, предположим, что объект предоставляет синхронизированный метод, который часто требует много времени для возврата. Если один поток часто вызывает этот метод, часто блокируются другие потоки, которые также требуют частого синхронизированного доступа к одному и тому же объекту.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment