JAVA Synchronisierung(Threads)

satix500 schrieb:
Hi,

Ich habe folgendes Problem: Ich möchte auf eine Methode mit mehreren Threads gleichzeitig zugreifen lassen, dazu brauche ich bestimmte Variablen(Counter) zu synchronisieren.

Was läuft hier falsch???

Entgegen einiger Meinungen, reicht es bei einer Multithreaded Anwendung nicht aus, einfach vor jede Methode das Wort synchronized zu klatschen und fertig ist die threadsichere Klasse.

Du musst sicherstellen das der Zugriff auf die Klassenvariable atomar ist. In dem Strang wurde mit java.util.concurrent.atomic und volatile bereits einiges gesagt.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html

Ich empfehle bei Datenstrukturen auch immer wieder

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html
 
Wie wäre es damit? Das sollte eigentlich schon an Synchronisation reichen. Habs allerdings nicht getestet.

Code:
public class Sync() {
	private int count=0;
   	
   	public void increment() { 
   		count++;
   	}
   	
    	public void decrement() {
   		count--;
   	}
   	
	public int value() { 
	   	return count;
	}
}

public class MyClass()
{
   	private static final Sync counter = new Sync();
   
   	/** Thread-Safe Singleton Constructor */
		static final private MyClass mycls;
		static {
	     		try {
	        		mycls = new MyClass();
	    		}
	    		catch(Throwable e) {
	       			throw new RuntimeException(e.getMessage());
	    		}
		}
	
	private MyClass() {}
	
	static public MyClass getInstance() {
	    return mycls;
	}


   	public void myMethod() {
     		synchronized(counter) {
      			counter.increment();
      			System.out.println("value: " + counter.value());
      		}
   	}
}


public class MyThread extends Thread() {
   	String name;
    	private MyClass myclsObject = MyClass.getInstance();
     
    	public void run() {	
        	myclsObject.myMethod();
    	}  
}

public class ThreadCreator() {
   	Thread t1 = new MyThread("Thread1");
   	Thread t2 = new MyThread("Thread2");
   	t1.start();
   	t2.start();
}
 
Zurück
Oben