Schlüsselwort synchronized - 2 Varianten

Klein0r

Erfahrenes Mitglied
Hallo zusammen,

ich bin ein wenig Ratlos ob es zwischen den beiden Folgenden Quelltexten einen unterschied gibt:

Java:
	public synchronized void test() {
		System.out.println("ole ole");
	}

und

Java:
	public void test() {
		synchronized (this) {
			System.out.println("ole ole");
		}
	}

Ich habe es so verstanden das bei der ersten Variante die Methode nur von einem Thread aufgerufen werden kann und die abarbeitung nicht paralell statt finden kann. Was ist aber mit anderen Methoden des Objektes? Können die weiterhin paralell aufgerufen werden?

lg
 
Hallo,

schau mal hier:
http://www.angelikalanger.com/Articles/JavaSpektrum/13.synchronized/13.synchronized.html
http://forum.java.sun.com/thread.jspa?threadID=352801&tstart=300

Demnach macht ist
void synchronized test(){ ...
nur eine andere schreibweise für:
void test(){
synchronized (this){
...
}
Beide Varianten sind semantisch Identisch, produzieren aber unterschiedlichen bytecode:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 *
 */
public class SynchronizedTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SynchronizedTest synchronizedTest = new SynchronizedTest();
		synchronizedTest.op1();
		synchronizedTest.op2();
	}

	public void op2() {
		synchronized (this) {
			System.out.println("a");
		}
	}

	public synchronized void op1() {
		System.out.println("b");
		
	}

}

Code:
D:\eclipse\workspaces\workspace-default\de.tutorials.training\bin>javap -c -classpath . de.tutorials.SynchronizedTest
Compiled from "SynchronizedTest.java"
public class de.tutorials.SynchronizedTest extends java.lang.Object{
public de.tutorials.SynchronizedTest();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   new     #1; //class de/tutorials/SynchronizedTest
   3:   dup
   4:   invokespecial   #16; //Method "<init>":()V
   7:   astore_1
   8:   aload_1
   9:   invokevirtual   #17; //Method op1:()V
   12:  aload_1
   13:  invokevirtual   #20; //Method op2:()V
   16:  return

public void op2();
  Code:
   0:   aload_0
   1:   dup
   2:   astore_1
   3:   monitorenter
   4:   getstatic       #26; //Field java/lang/System.out:Ljava/io/PrintStream;
   7:   ldc     #32; //String a
   9:   invokevirtual   #34; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   12:  aload_1
   13:  monitorexit
   14:  goto    20
   17:  aload_1
   18:  monitorexit
   19:  athrow
   20:  return
  Exception table:
   from   to  target type
     4    14    17   any
    17    19    17   any

public synchronized void op1();
  Code:
   0:   getstatic       #26; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #43; //String b
   5:   invokevirtual   #34; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return

}

Gruß Tom
 
Zurück