基本上我的层次结构是我有一个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!
所以它并没有真正同步。因为这些类是由不同的线程访问我假设导致问题。有没有办法实际同步我的方法,以便一次只有一个访问权限?
答案 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
}