小编RaM*_*abU的帖子

使用ArrayList()的多线程获得了ArrayIndexOutOfBoundsException

我已经通过非线程安全对象(这里是ArrayList)运行以下代码来运行多个线程:

import java.time.LocalDateTime;
import java.util.List;
import java.util.ArrayList;

public class A implements Runnable {
    String name;

    static  List<Integer> list = new ArrayList();
    private static Object lock = new Object();

    A(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for(int i = 1; i <= 1000; i++) {
            list.add(i);
        }
        System.out.println(list.size());
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待这段代码只是为了产生错误的答案,因为ArrayList它不是线程安全的.但相反,我得到这个错误:

Exception in thread "Thread-1" 1003
2401
2799
3799
java.lang.ArrayIndexOutOfBoundsException: 109
    at java.util.ArrayList.add(Unknown Source)
    at threads.A.run(A.java:16)5123

    at java.lang.Thread.run(Unknown Source)
Exception in thread …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading arraylist

3
推荐指数
2
解决办法
574
查看次数

为什么同步块给出了错误的答案?

我正在努力学习同步.根据我学到的东西卡在这里下面的代码应该给8000作为最终结果,但我得到一个随机的结果,如下面的
包线程;

import java.time.LocalDateTime;

public class A implements Runnable {
    String name;
    static Integer j=0;
    A(String name){
        this.name=name;
    }
    @Override
    public synchronized void  run() {
        for(int i=1;i<=1000;i++){
            synchronized(this){
            A.j++;
            }
        }
        System.out.println(j);
    }

package threads;

public class MainClass {
public static void main(String args[]){
    Thread t1=new Thread(new A("i am thread A "));
    Thread t2=new Thread(new A("i am thread B "));
    Thread t3=new Thread(new A("i am thread C "));
    Thread t4=new Thread(new A("i am thread D "));
    Thread t5=new Thread(new A("i …
Run Code Online (Sandbox Code Playgroud)

java multithreading synchronization java-8

2
推荐指数
2
解决办法
225
查看次数

Java中集合与Java中列表的性能

考虑下面的代码

List<Integer> l=new ArrayList();
Set<Integer> l=new HashSet();
Run Code Online (Sandbox Code Playgroud)

以下哪个 for 循环是最佳的

for(Integer i: some arrray){
    if(!l.contains(i))
    l.add(i);
}
Run Code Online (Sandbox Code Playgroud)

或者

 for(Integer i :some array){
   s.add(i);
}
Run Code Online (Sandbox Code Playgroud)

java collections java-8

-2
推荐指数
1
解决办法
6369
查看次数