我已经通过非线程安全对象(这里是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) 我正在努力学习同步.根据我学到的东西卡在这里下面的代码应该给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) 考虑下面的代码
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)