# java.lang.IllegalMonitorStateException: object not locked by thread before notify()



## newbie2009 (7. Feb 2012)

Hey Leute habe mal eine Frage.
Ich versuche mit threads zu arbeiten aber bekomme immer die folgende Fehlermeldung, obwohl ich eigentlich den einen Thread mitm lock belege:
	
	
	
	





```
java.lang.IllegalMonitorStateException: object not locked by thread before notify()
```


```
private static Object lock = new Object();
// meine main 


		Thread t1 = new Thread(new Runnable() {
			public void run() {
				proceed();

			}
		});

		Thread t2 = new Thread(new Runnable() {
			public void run() {

				ladeBalken();
			}
		});

		t2.start();
		t1.start();
 }


// Methoden 


public static void proceed() {
		synchronized (lock) {

			try {
				System.out.println("vorfahrt gewähren");
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();

			}
			kHandler.post(new Runnable() {

				@Override
				public void run() {

					System.out.println("verarbeite nun die PDf");
					pdfReaderActivity.lokalOperation();

					lock.notify();

				}
			});

		}
	}

	public static void ladeBalken() {
		synchronized (lock) {

			try {

		
				System.out.println("ladeBalken gestartet");
				System.out.println("ladeBalken legt sich schlafen");

		

			System.out.print("schließe Fenster");
					lock.wait();
				

			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
```

Laut Meldung tritt der Fehler immer auf, sobald die Methode notify() aufgerufen wird. Was mache ich verkehrt????:L

mfg newbie


----------



## Tobias (7. Feb 2012)

notify() kann nur auf Objekten aufgerufen werden, deren Lock vom aktuellen Thread gehalten wird. Es reicht nicht, das irgendein Thread dieses Lock besitzt (bzw besessen hat).

Also angenommen:


```
kHandler.post(new Runnable() {
 
                @Override
                public void run() {
 
                    System.out.println("verarbeite nun die PDf");
                    pdfReaderActivity.lokalOperation();
 
                    lock.notify();
 
                }
            });
```

startet einen NEUEN Thread, der die Runnable ausführt, dann besitzt dieser Thread zum Zeitpunkt des Aufrufs von notify() nicht den Monitor von lock und fällt deshalb auf die Schnauze.

Edit: Erläuterungen um zweiten Abschnitt ergänzt.


----------



## newbie2009 (7. Feb 2012)

Tobias hat gesagt.:


> notify() kann nur auf Objekten aufgerufen werden, deren Lock vom aktuellen Thread gehalten wird. Es reicht nicht, das irgendein Thread dieses Lock besitzt (bzw besessen hat).
> 
> Also angenommen:
> 
> ...



Ok klingt so weit logisch und wie löse ich das am besten? Muss ich auch im neuen Thread wieder mit synchronized arbeiten?

Ok scheint zu funktionieren, danke für den Hinweis.


----------

