Java同步类中的方法

时间:2013-10-12 14:06:36

标签: java multithreading synchronization thread-safety synchronized

基本上我的层次结构是我有一个A类,它启动B类的100个线程,而B类使用一个名为FileCreator的类。 FileCreator类有一个名为writeToFile()的方法,它是同步的。 这就是我在B类中实例化它的方式:

FileCreator newFile = new FileCreator(downloadFolder, content, page.getWebURL());
newFile.writeToFile();

现在我的问题是writeToFile()实际上并未同步。基本上这就是我对writeToFile()

所做的
public synchronized void writeToFile() {
        System.out.println("Thread accessed");
        //Some stuff here
        System.out.println("Thread FINISHED!");
}

但是我在我的控制台中得到了这个结果:

Thread accessed
Thread accessed
Thread FINISHED!
Thread FINISHED!

所以它并没有真正同步。因为这些类是由不同的线程访问我假设导致问题。有没有办法实际同步我的方法,以便一次只有一个访问权限?

2 个答案:

答案 0 :(得分:1)

它基于每个实例进行同步。实例方法上的synchronized表示

synchronized(this) {
    ...
}

但是因为你有100个实例,所以没有一个实例。您需要在共享对象上进行同步。将lock对象传递给每个实例,或者只创建一个传递给每个Thread的实例。该实例synchronize

答案 1 :(得分:1)

我会使用“虚拟”对象并对其进行同步。 块级别更有效,因为它不会锁定整个方法。

Object xLock = new Object(); // !!! in you main thread

....

public void writeToFile() {
    synchronized(xLock ){
      System.out.println("Thread accessed");
      //Some stuff here
      System.out.println("Thread FINISHED!");
    }       
}

但是你也可以写一下:

 public void writeToFile() {
    synchronized(this){
      System.out.println("Thread accessed");
      //Some stuff here
      System.out.println("Thread FINISHED!");
    }       
  }

}

请记住,xLock应该在主线程中启动。

作为参考

<强> ======================

方法级别

class MethodLevel {

  //shared among threads
SharedResource x, y ;

public void synchronized method1() {
   //multiple threads can't access
}
public void synchronized method2() {
  //multiple threads can't access
}

 public void method3() {
  //not synchronized
  //multiple threads can access
 }
}

阻止级别

class BlockLevel {
  //shared among threads
  SharedResource x, y ;

  //dummy objects for locking
  Object xLock = new Object();
  Object yLock = new Object();

    public void method1() {
     synchronized(xLock){
    //access x here. thread safe
    }

    //do something here but don't use SharedResource x, y
    // because will not be thread-safe
     synchronized(xLock) {
       synchronized(yLock) {
      //access x,y here. thread safe
      }
     }

     //do something here but don't use SharedResource x, y
     //because will not be thread-safe
    }//end of method1
 }