0

基本上我的層次結構是我有一個類A,它啓動100個B類線程,而B類使用一個叫FileCreator的類。 FileCreator類有一個名爲writeToFile()的方法,它被同步。 這是我如何實例化它的B類中:Java同步類中的方法

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! 

所以它不是真正的同步。因爲這些類是由不同的線程訪問,我假設這會導致問題。有沒有一種方法可以實際上同步我的方法,以便一次只有一個訪問權限?

回答

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 
} 
+0

看到我的編輯,只有裏面有'synchronized(xLock){/*..*/}' –

+0

是的,我只是明白了。所以我應該創建一個單例xLock? –

+0

是的,只需要像Object Lock = new Object()那樣創建一個'Object'並使用上面提到的方法。 –

1

它基於每個實例同步。​​上的實例方法意味着

synchronized(this) { 
    ... 
} 

但既然你有100分的情況下,他們都不塊。您需要在共享對象上進行同步。將lock對象傳遞給每個實例,或者只創建一個傳遞給每個Thread的實例。該實例中的synchronize