当前位置: 首页 > article >正文

【Java并发编程六】多线程越界问题

ArrayList()越界错误

import java.util.ArrayList;
public class myTest implements Runnable {
    static ArrayList<Integer> a = new ArrayList<>(10);
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new myTest());
        Thread t2 = new Thread(new myTest());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(a.size());
    }
    @Override
    public void run() {
        for(int i=0; i<10000; i++) {
            a.add(i);
        }
    }
}

 上面的代码会有三种可能的运行结果:
①越界。因为List的add方法会先检查list是否足够,从而选择扩容,若第一个线程刚刚扩容完毕,还未添加,第二个线程就进行了检查,从而导致list越界。
②正常结果。结果为20000。
③异常结果。这是因为两个线程同时对i的值进行修改。

HashMap

 HashMap也会出现上述情况。

解决措施

 使用synchronized修饰方法。

import java.util.ArrayList;
public class myTest implements Runnable {
    static ArrayList<Integer> a = new ArrayList<>(10);
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new myTest());
        Thread t2 = new Thread(new myTest());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(a.size());
    }
    public static synchronized void func() {
        for(int i=0; i<10000; i++) {
            a.add(i);
        }
    }
    @Override
    public void run() {
        func();
    }
}

http://www.kler.cn/a/133767.html

相关文章:

  • [Effective C++]条款48 模板元编程(TMP)
  • unity插件Excel转换Proto插件-ExcelToProtobufferTool
  • Python----Python高级(正则表达式:语法规则,re库)
  • kotlin的协程的基础概念
  • WPF2-在xaml为对象的属性赋值
  • 编译chromium笔记
  • nginx 如何根据IP做限流,以及 nginx 直接返回 json 格式数据
  • 深信服AC密码认证(外部认证:LDAP认证)
  • C#中委托和事件的使用总结
  • JDK1.5 新特性【反射】
  • 大数据基础设施搭建 - ZooKeeper
  • 漏洞利用工具的编写
  • kafka 磁盘扩容与数据均衡实在操作讲解
  • K-Means算法进行分类
  • 2342. 数位和相等数对的最大和 --力扣 --JAVA
  • MySQL数据库下的Explain命令深度解析
  • 自动驾驶学习笔记(九)——车辆控制
  • .NET 8 正式 GA 遥遥领先
  • kaggle新赛:SenNet 3D肾脏分割大赛(3D语义分割)
  • windows 安装 Oracle Database 19c
  • WPF如何实现应用程序托盘
  • 【算法日志】图论 并查集及其简单应用
  • [C国演义] 哈希的使用和开闭散列的模拟实现
  • 【网络通信】探索UDP与TCP协议、IP地址和端口号的奥妙
  • 计算机科学速成课
  • 单链表在线OJ题(详解+图解)