首页 > 其他分享 >Vector线程安全问题

Vector线程安全问题

时间:2024-10-11 18:36:22浏览次数:9  
标签:enemy 遍历 java bullet getBullets 安全 Vector 线程

背景

在韩顺平的Java课程中,有一个坦克大战练习项目,其中有这样一个功能需求:敌人坦克自动发射多个子弹,检测子弹是否击中我方坦克。视频中使用的是Vector存储这个子弹队列。

代码实现

对于这一部分,我的实现代码是:

// MyPanel.java 的 run()方法
while (true) {
    try {
        Thread.sleep(50);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    // 检测hero的子弹是否打中敌人
    for(Bullet bullet: hero.getBullets()) {
        if (bullet != null && bullet.life) {
            for (int i = 0; i < enemySize; i++) {
                hitEnemy(bullet, enemies.get(i));
            }
        }
    }

    // 检测我方坦克是否被打中
    for (Enemy enemy: enemies) {
        if(enemy.isLife() && hero.isLife()) {
            for(Bullet bullet: enemy.getBullets()){
                if (bullet != null && bullet.life) {
                    hitEnemy(bullet, hero);
                }
            }
        }
    }
    this.repaint();
}

代码报错

在运行过程中,在检测我方坦克是否被打中的代码部分抛出了这样的错误:

java.util.ConcurrentModificationException
	at java.util.Vector$Itr.checkForComodification(Vector.java:1210)
	at java.util.Vector$Itr.next(Vector.java:1163)
	at org.example.MyPanel.run(MyPanel.java:196)
	at java.lang.Thread.run(Thread.java:748)

分析

GPT的回答:

虽然Vector 在 Java 中确实是线程安全的。它通过在所有修改操作(如 addremove 等)上添加 synchronized 来确保线程安全。然而,尽管 Vector 在修改操作上是线程安全的,它并不能防止在遍历期间集合结构被修改引发的 ConcurrentModificationException

这是因为 Vector遍历操作本身并不是同步的Vector 的迭代器(Iterator)在设计上不具备对集合结构的并发修改进行保护,仍然会在检测到集合在迭代期间被修改时抛出 ConcurrentModificationException。这和集合的同步性是两个独立的概念。

由于该项目实现了多线程,有可能对单个子弹队列删除的同时进行遍历,使之出现报错。

解决方法

// ........
// 检测我方坦克是否被打中
//for (Enemy enemy: enemies) {
//    if(enemy.isLife() && hero.isLife()) {
//        for(Bullet bullet: enemy.getBullets()){
//            if (bullet != null && bullet.life) {
//                hitEnemy(bullet, hero);
//            }
//        }
//    }
//}

// synchronized加锁 
// 如果还涉及其他add、remove等操作 也可以使用Collections.synchronizedList()
synchronized(enemy.getBullets()) {
    for (Bullet bullet : enemy.getBullets()) {
        if (bullet != null && bullet.life) {
            hitEnemy(bullet, hero);
        }
    }
}

但是,修改成以下的方法也不会报错:

for (int i=0; i < enemy.getBullets().size();i++) {
    Bullet bullet = enemy.getBullets().get(i);
    if (bullet != null && bullet.life) {
        hitEnemy(bullet, hero);
    }
}

分析:

  • 索引遍历 (for (int i=0; i < enemy.getBullets().size(); i++)):这种遍历方式直接根

  • 据索引访问 List 中的元素,并不依赖 Iterator。当使用这种方式时,List 只会获取特定索引位置的元素,不会跟踪列表是否在遍历过程中发生了修改。

  • 迭代器遍历 (for (Bullet bullet : enemy.getBullets())):这种方式使用了 IteratorIterator 是设计用于在遍历过程中检测列表结构是否被修改的。Iterator 内部维护着一个修改计数器(modCount),如果在遍历期间列表的结构发生变化(如添加、删除元素),modCountIterator 的期望值不一致时,会抛出 ConcurrentModificationException

  • 简单来说,索引遍历没有 Iterator 那种内置的“并发修改检测机制”,所以不会抛出异常。

标签:enemy,遍历,java,bullet,getBullets,安全,Vector,线程
From: https://www.cnblogs.com/walkallday/p/18458889

相关文章

  • 2024最新最全:网络安全人士【必备的30个安全工具】
    1.WiresharkWireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。2.MetasploitMetasploit是一个免费的、可下载的框架,通过它可以很容易......
  • C# 线程---Thread1
     1.thread不带参数(Main和Thread都在同步处理)(注意usingstatic和System.Console的使用)usingstaticSystem.Console;namespaceRecipe1{classProgram{staticvoidMain(string[]args){Threadt=newThread(PrintNumber);......
  • Windows多线程编程 互斥量和临界区使用
    Windows多线程编程允许程序同时运行多个线程,提高程序的并发性和执行效率。多线程编程中的核心概念包括线程的创建、同步、调度、数据共享和竞争条件等。本文详细介绍了Windows多线程编程的关键技术点,并解释如何使用线程同步机制来保证线程安全。1.线程基础概念1.1线......
  • 面临327万人缺口!网络空间安全专业人才不愁就业!
    教育部网站发布《2024年度普通高等学校本科专业申报材料公示》,根据公示统计2024年度拟新增专业535个,涉及353所高校。其中,申报数量TOP2专业是网络空间安全(37个)。并且截止至2024年6月,我国已有626所高校开设网络空间安全专业,网络安全专业教育在我国高等教育体系中逐渐占据重要......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。
      关于我我算是“入行”不久的一个新人安全工作者,为什么是引号呢,因为我是个“半个野路子”出身。早在13年的时候,我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力,我逐渐淡出了安全圈子,也没有继续学习技术。也因为这个原因,高考选择专业时,对......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。
      关于我我算是“入行”不久的一个新人安全工作者,为什么是引号呢,因为我是个“半个野路子”出身。早在13年的时候,我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力,我逐渐淡出了安全圈子,也没有继续学习技术。也因为这个原因,高考选择专业时,对......
  • 如何用3个月零基础入门网络安全?_网络安全零基础怎么学习
    前言写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全,实现自己的“黑客梦”。文章的宗旨是:1.指出一些自学的误区2.提供客观可行的学习表3.推荐我认为适合小白学习的资源.大佬绕道哈!一、自学网络安全学习的误区和陷阱1.不要试图先成为一名程序员(以编程为基础......
  • 从零开始了解云WAF,您的网站安全升级指南
    网站安全对任何线上业务来说至关重要,尤其是在网络威胁不断升级的今天。无论是流量高峰期还是日常运营,确保数据安全与服务稳定是每个网站运营者最关心的事情。云WAF(Web应用防火墙)作为一种高效的安全防护手段,正逐渐成为保障网站安全的首选方案,帮助企业快速升级网站的防护能力。......
  • 外贸电商系统如何保障交易安全:技术视角的深度解析与效果评估
    外贸电商系统是一个集成了多种先进技术和功能的综合性平台,旨在为国际间的商业交易提供便捷、高效的服务。该系统不仅支持多语言界面和多种货币结算,还涵盖了从产品展示、客户管理、订单处理到物流配送、支付结算等全流程的管理功能。通过优化供应链管理,提高交易效率,减少中间环节成......
  • 自学网络安全(黑客技术)2024年 —90天学习计划
    ......