问题遇到的现象和发生背景
/*在坦克大战游戏当中,我方坦克和敌方坦克均可以发射炮弹。
- 现只考虑我方坦克发射炮弹的情况
- 在没有升级前,我方坦克发射的炮弹只有在碰到敌方坦克、障碍物爆炸或越过边界后(可以使用线程休眠一定时间来模拟)才能发射下一发炮弹。
- 请编写程序模拟我方坦克发射炮弹的过程。*/
问题相关代码,请勿粘贴截图
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颗炮弹
十颗炮弹已全部发射完毕,请重新装填炮弹
我的解答思路和尝试过的方法
尝试把同步代码块放入不同位置,仍然存在数据安全问题
我想要达到的结果
解决数据重复的问题,及为什么把共同数据放入了同步代码块仍然出现了数据安全问题?