q3tempest
Lieutenant
- Registriert
- Sep. 2002
- Beiträge
- 595
Hi,
ich habe problem mit synchronisierten Methoden.
Ich hab 2 Thread erstellt, die auf einem gemeinsamen Variable zugreifen.
Ein Thread erhoert counter:long um 1, andere erniedrigt um 1.
Mit synchronisierten Block ( demoSyncObj() ) funktioniert, aber mit
synchronisierten Methoden ( demoSyncMed() ) ist counter nicht immer 0.
Wieso funktioniert synchronisierten Methoden nicht? Wo hab ich da Fehler uebersehen?
Temp
ich habe problem mit synchronisierten Methoden.
Ich hab 2 Thread erstellt, die auf einem gemeinsamen Variable zugreifen.
Ein Thread erhoert counter:long um 1, andere erniedrigt um 1.
Mit synchronisierten Block ( demoSyncObj() ) funktioniert, aber mit
synchronisierten Methoden ( demoSyncMed() ) ist counter nicht immer 0.
Wieso funktioniert synchronisierten Methoden nicht? Wo hab ich da Fehler uebersehen?
Temp
Code:
package testThread;
public class TestThread extends Thread {
public static final long MAX = 100000;
private long increment = 0;
static long counter = 0;
static Object o = new Object();
public TestThread(long increment) {
this.increment = increment;
}
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
TestThread thread1 = new TestThread(+1);
TestThread thread2 = new TestThread(-1);
long start = System.currentTimeMillis();
thread1.start();
thread2.start();
try
{
thread1.join();
thread2.join();
}
catch (Exception e)
{
e.printStackTrace();
}
long time = System.currentTimeMillis() - start;
System.out.printf("Counter: %11d nach %6d ms\n",counter, time);
}
}
public void demoUnsync() {
for (long i= 0; i < MAX; i++) {
counter = counter + increment;
}
}
public void demoSyncObj() {
for (long i= 0; i < MAX; i++) {
synchronized(o) {
counter = counter + increment;
}
}
}
public synchronized void demoSyncMed() {
for (long i= 0; i < MAX; i++) {
counter = counter + increment;
}
}
public void run() {
//demoUnsync();
//demoSyncObj();
demoSyncMed();
}
}