如何在此非线程安全的arraylist类上引发竞争条件?

问题描述

我正在尝试构建一个线程安全的arraylist类

import java.util.stream.*;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class LongArrayListUnsafe {
public static void main(String[] args) {
LongArrayList dal1 = LongArrayList.withElements();

ExecutorService executorService =  Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

for (int i=0; i<1000; i++) {
executorService.execute(new Runnable() {
  public void run() {
    for (int i=0; i<10; i++)
      dal1.add(i);
  }
 });}
System.out.println("Using toString(): " + dal1);


for (int i=0; i<dal1.size(); i++)
  System.out.println(dal1.get(i));

System.out.println(dal1.size());} }

class LongArrayList {

private long[] items;
private int size;

public LongArrayList() {
   reset();
}

public static LongArrayList withElements(long... initialValues){
   LongArrayList list = new LongArrayList();
   for (long l : initialValues) list.add( l );
   return list;
}

// reset me to initial 
public void reset(){
  items = new long[2];
  size = 0;
}

// Number of items in the double list
public int size() {
  return size;
}

// Return item number i
public long get(int i) {
  if (0 <= i && i < size) 
   return items[i];
  else 
    throw new IndexOutOfBoundsException(String.valueOf(i));
   }

   // Replace item number i,if any,with x
   public long set(int i,long x) {
   if (0 <= i && i < size) {
    long old = items[i];
    items[i] = x;
    return old;
   } else 
     throw new IndexOutOfBoundsException(String.valueOf(i));}

   // Add item x to end of list
   public LongArrayList add(long x) {
   if (size == items.length) {
   long[] newItems = new long[items.length * 2];
   for (int i=0; i<items.length; i++)
       newItems[i] = items[i];
  items = newItems;
}
items[size] = x;
size++;
return this;
}

public String toString() {
  return Arrays.stream(items,size)
  .mapToObj( Long::toString )
  .collect(Collectors.joining(",","[","]"));
}
}

“ Longaraylist”类只是一个不是线程安全的列表的类,这是我以后要操纵以变为线程安全的类。 现在让我感到烦恼的是main中的驱动程序代码,我正在创建executorservice,并向其提交了许多任务。在我看来,使用这个非线程安全的类,这应该引入一些竞争条件,并且“ size”变量至少应该被破坏。但是,每次我运行此代码时,它都运行良好。我最后打印的大小完全对应于add()调用的次数。

我可以做些什么?也许我使用的executorservice错误? 我还要感谢其他任何提示来测试此类的线程安全性。谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...