阿尔萨斯的霜之哀伤 2022-03-24 00:01 采纳率: 70%
浏览 90
已结题

写了一个synchronized 同步方法,但是没有达到同步效果,求解答!

背景说明:使用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

  • 写回答

3条回答 默认 最新

  • 等会儿咱吃啥 2022-03-24 10:19
    关注

    把方法的调用也发上来

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月24日

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因