老坛酸菜吃鸭子 2022-04-05 16:41 采纳率: 83.3%
浏览 72
已结题

【java】多线程 使用同步代码块仍然出现数据安全问题(数据重复)

问题遇到的现象和发生背景

/*在坦克大战游戏当中,我方坦克和敌方坦克均可以发射炮弹。

  • 现只考虑我方坦克发射炮弹的情况
  • 在没有升级前,我方坦克发射的炮弹只有在碰到敌方坦克、障碍物爆炸或越过边界后(可以使用线程休眠一定时间来模拟)才能发射下一发炮弹。
  • 请编写程序模拟我方坦克发射炮弹的过程。*/
    问题相关代码,请勿粘贴截图

public class Tankwar {

    public static void main(String args[]) {
        
        Shot s=new Shot();
        Thread t1=new Thread(s);
        Thread t2=new Thread(s);
        t1.start();t2.start();
    }
    
}



import java.util.Random;

public class Shot implements Runnable {//发射炮弹

    private int s=10;//共有十颗炮弹
    private int x=0;
    Object o=new Object();

    
    @Override
    public void run() {
     
      synchronized(o) {
        while (s<=10) {
        
            System.out.println("正在发射第"+(10-s)+"颗炮弹");
            Random r = new Random();
            x=r.nextInt(4)+1;//获取1-3的随机整数
             
            switch(x) {
              case(1):System.out.println("碰到敌方坦克,重新发射");s--; break;
              case(2):System.out.println("障碍物爆炸,重新发射");s--; break;
              case(3):System.out.println("越过边界,重新发射");s--; break;
            }         
             if(s==1) {
                   System.out.println("十颗炮弹已全部发射完毕,请重新装填炮弹");
                   break;}
              try {
                 Thread.sleep(200);//让子弹休眠
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
        }
      }
    
  }
    
    
}

运行结果及报错内容

正在发射第0颗炮弹
越过边界,重新发射
正在发射第1颗炮弹
碰到敌方坦克,重新发射
正在发射第2颗炮弹
障碍物爆炸,重新发射
正在发射第3颗炮弹
碰到敌方坦克,重新发射
正在发射第4颗炮弹
碰到敌方坦克,重新发射
正在发射第5颗炮弹
障碍物爆炸,重新发射
正在发射第6颗炮弹
正在发射第6颗炮弹
越过边界,重新发射
正在发射第7颗炮弹
障碍物爆炸,重新发射
正在发射第8颗炮弹
正在发射第8颗炮弹
越过边界,重新发射
十颗炮弹已全部发射完毕,请重新装填炮弹
正在发射第9颗炮弹
十颗炮弹已全部发射完毕,请重新装填炮弹

我的解答思路和尝试过的方法

尝试把同步代码块放入不同位置,仍然存在数据安全问题

我想要达到的结果

解决数据重复的问题,及为什么把共同数据放入了同步代码块仍然出现了数据安全问题?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月13日
    • 创建了问题 4月5日

    悬赏问题

    • ¥15 静电纺丝煅烧后如何得到柔性纤维
    • ¥15 (标签-react native|关键词-镜像源)
    • ¥100 照片生成3D人脸视频
    • ¥15 伪装视频时长问题修改MP4的时长问题,
    • ¥15 JETSON NANO
    • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
    • ¥20 关于 openpyxl 处理excel文件地问题
    • ¥15 MS中不知道高分子的构型怎么构建模型
    • ¥60 QQOP数据,什么是op数据号,怎么提取op数据!能不能大量提取(语言-c语言)
    • ¥15 matlab代码 关于微分方程和嵌套的分段函数。