Java watki- zakladanie blokady na metody

0

Czesc,ogarniam watki w javie i mam pytanie odnosnie zakladania blokady na metody.Ponizej znajduje sie moj kod

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Counter {
	private int counter = 0;

	Counter() {

	}

	public void increment() {
		counter++;
	}

	public void decrement() {

		counter--;

	}

	public int getCounter() {

		return counter;

	}
}

class ThreadOperations implements Runnable {
	Counter c;
	Lock lock;

	ThreadOperations(Counter c) {
		this.c = c;
		lock = new ReentrantLock();
	}

	@Override
	public void run() {
		lock.lock();
		try {
			c.decrement();
			c.increment();
			System.out.println("Counter" + c.getCounter());
		} finally {
			lock.unlock();
		}

	}
}

public class ThreadClass {
	public static void main(String[] args) throws InterruptedException {
		Counter c = new Counter();
		for (int i = 0; i < 1000; i++) {
			Thread t = new Thread(new ThreadOperations(c));
			t.start();
		}
	}
}

i wydawalo mi sie ze zalozenie blokady w run spowoduje ze dostane za kazdym razem napis 0, a tak sie nie dzieje. Moglby mi ktos wytlumaczyc jak dziala zakladanie blokady na metode?

Z gory dzieki za odpowiedz

2

W złym miejscu blokujesz, ponieważ gdy tworzysz nowy obiekt:

new ThreadOperations(c)

to za każdym razem tworzysz jeden Lock, każdy wątek ma swojego Locka a Lock powinien być współdzielonny na wszystkie wątki żeby działał poprawnie. Teraz do obiektu jednego Locka ma dostęp tylko JEDEN wątek, więc jak ma zablokować inny wątek?
Można zrobić tak:

Runnable myRunnable = new ThreadOperations(c);
		for (int i = 0; i < 1000; i++) {
			Thread t = new Thread(myRunnable);
			t.start();
		}

Teraz każdy wątek ma dostęp do Locka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1