Synchronization Solution

1. Solution 1: synchronize on the shared data

public class SomeThreadedClass extends Thread {
  private static Vector sharedObject; //shared data
  private Integer localObject;        //not shared

  private void accessSomeSharedObject() {
    // change values in sharedObject
    ...
  } 

public void doSomeOperation() { 
    synchronized(sharedObject) {
      accessSomeSharedObject();
    }
  }

  public void run() {
    while(someCondition) {
      doSomeOperation();      // accesses shared data
      doSomeOtherOperation(); // no shared data
    }
  }

  public void doSomeOtherOperation() {
    // change values in localObject
    ...
  }
  ...
}

3. Solution 2: synchronize on the class object

public class SomeThreadedClass extends Thread {
  private static Vector sharedObject;//shared data
  private Integer localObject;        //not shared

  private void accessSomeSharedObject() {
    // change values in sharedObject
    ...
  } 

  public void doSomeOperation() { 
    synchronized(SomeThreadedClass.class) {
      accessSomeSharedObject();
    }
  }

  public void run() {
    while(someCondition) {
      doSomeOperation();      // accesses shared data
      doSomeOtherOperation(); // no shared data
    }
  }

  public void doSomeOtherOperation() {
    // change values in localObject
    ...
  }
  ...
}

4. Solution 3: synchronize on arbitrary object

Make an arbitrary shared (static) object in SomeThreadedClass.

public class SomeThreadedClass extends Thread {
  private static Vector sharedObject;//shared data
  private Integer localObject;        //not shared
  private static Object lockObject = new Object();
  private void accessSomeSharedObject() {
    // change values in sharedObject
    ...
  } 

  public void doSomeOperation() { 
    synchronized(lockObject) {
      accessSomeSharedObject();
    }
  }

  public void run() {
    while(someCondition) {
      doSomeOperation();      // accesses shared data
      doSomeOtherOperation(); // no shared data
    }
  }

  public void doSomeOtherOperation() {
    // change values in localObject
    ...
  }
  ...
}

5. Does this problem occur with Runnable?

© 1996-2000 Marty Hall, 1999-2000 Lawrence M. Brown