背景说明:使用synchronized 写了一个同步方法,想要实现1个线程调用该方法时,其他线程等待。
方法说明:方法目的是把指定文件夹下的多个对象反序列化读入一个对象数组,每反序列化完一个对象就删除该文件,避免其他线程再重复反序列化同一个对象。
运行结果:在多线程运行时,synchronized 并没有起到锁的作用,结果是两个线程同时调用该方法。
方法源码如下:
public synchronized Account[] inAccounts(String folder, int groupSize) throws Exception {
File file = new File(folder);
File[] files = file.listFiles();
Account[] accounts = new Account[groupSize];
int indexAccounts = 0;
// 遍历文件数组,依次反序列化
for (int i = files.length - 1; i > 0; i--) {
// 只取索引小于数组个数的文件
if (indexAccounts > groupSize - 1)
continue;
ObjectInputStream in = new ObjectInputStream(new FileInputStream(files[i]));
accounts[indexAccounts] = (Account) in.readObject();
indexAccounts++;
in.close();
System.out
.println(Thread.currentThread().getName() + "删除文件" + files[i].getName() + ":" + files[i].delete());
}
return accounts;
}
运行结果部分如下:
线程1删除文件MACD,OBV-BBI,MACD(1.0).obj:false
线程2删除文件MACD,OBV-BBI,MACD(1.0).obj:true
线程2删除文件KDJ-BBI,BIAS,DMI(1.0).obj:false
线程1删除文件KDJ-BBI,BIAS,DMI(1.0).obj:true
线程2删除文件KDJ,WR-BBI,MACD,SL(1.0).obj:false
线程1删除文件KDJ,WR-BBI,MACD,SL(1.0).obj:true
线程2删除文件DPO-KDJ,VR(2.0).obj:false