当前位置: 首页 > 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

相关文章:

  • LaTeX之四:如何兼容中文(上手中文简历和中文论文)、在win/mac上安装新字体。
  • 软件工程师简历(精选篇)
  • WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等
  • acwing算法基础02一高精度,前缀和,差分
  • 解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url
  • C++面试基础知识:排序算法 C++实现
  • 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题(详解+图解)