`

实验--线程安全(1)ArrayList

 
阅读更多

事实不像想象中的那样,实践,体会的才深。

 

被覆盖输出

list.size()=1937  //73个元素被覆盖// 如果size==2000,再试一次直到size <2000

p=1508,n=1510  //1509被覆盖

p=1575,n=1577  //1509被覆盖

检查全部输出:

1506-3001-1507-1508-3002-1510,发现1509被覆盖了。

 

LinkList,不仅会少,还会nullPointer,因为本身它的last.next==null,多线程,会让被覆盖的元素.next==null,next.next时就会nullPointer了。

import java.util.ArrayList;
import java.util.List;
/**
 * @author timeriver.wang
 * @date 2014-04-18 8:59:08 AM
 */
public class Test {
    public static void main( String[] args ) {
        new Test().work();
    }
    
    public void work(){
        List<Integer> list = new ArrayList<Integer>(2000);
        TT tt = new TT(list);
        Thread t1 = new Thread( tt, "t-1" );
        Thread t2 = new Thread( tt, "t-2" );
        t1.start();
        t2.start();
        //尽量保证两个线程的方法体同时开始执行
        tt.started =true;
        //确保线程t-1,t-2运行结束
        try {
            Thread.sleep( 10000 );
        }
        catch ( InterruptedException e ) {
        }
        printSeq( list );
        printAll( list );
    }
    
    private class TT implements Runnable{
        private List<Integer> list;
        public volatile boolean started;
        public TT(List<Integer> list){
            this.list = list;
        }
        @Override
        public void run() {
            while(true){
                if(started){
                    if(Thread.currentThread().getName().contains( "-1" )){
                        System.out.println(Thread.currentThread().getName()+list.size());
                        for(int i=1000;i<2000;i++){
                            list.add( i );
                        }
                    }else{
                        System.out.println(Thread.currentThread().getName()+list.size());
                        for(int i=3000;i<4000;i++){
                            list.add( i );
                        }
                    }
                    break;
                }
            }
        }
    }
    
    private void printAll(List<Integer> list){
        System.out.println("############################");
        System.out.println("输出全部");
        System.out.println("############################");
        System.out.println("list.size()="+list.size());
        for(int i=0;i<list.size();i++){
            System.out.print(list.get( i )+"-");
            if(i%100 == 0){
                System.out.println();
            }
        }
    }
    
    private void printSeq(List<Integer> list){
        System.out.println("############################");
        System.out.println("顺序被覆盖的元素输出");
        System.out.println("############################");
        System.out.println("list.size()="+list.size());
        int p = 999;
        int n = 0;
        for(int i=0;i<list.size();i++){
            n = list.get(i );
            if(n == p+1){
                p = n;
            }else if((n > p+1) && n < p + 1000){
                System.out.println("p="+p+",n="+n);
                p=n;
            }
        }
    }
}

 

分享到:
评论

相关推荐

    JAVA语言程序设计-第十四章 多线程

    - 使用线程安全的数据结构,如ConcurrentHashMap,ArrayList的线程不安全,应使用CopyOnWriteArrayList等替代。 以上是Java语言程序设计中关于多线程的基本知识点,理解和掌握这些内容对于编写高效、可靠的多线程...

    java 猜数字游戏,学习线程

    这个游戏可以帮助开发者理解线程间的通信、同步以及线程安全问题。 1. **线程基础知识**: 线程是操作系统分配CPU时间的基本单元,一个进程可以有多个线程,它们共享同一块内存空间,各自执行不同的任务。在Java中...

    计算机后端-Java-Java高并发从入门到面试教程-存思路.zip

    6. **线程安全与非线程安全** - **线程不安全的实例**:如`StringBuilder`与`StringBuffer`,以及在并发环境下对静态变量的操作。 - **线程安全类**:如`Atomic*`系列,`Collections.synchronized*`系列。 7. **...

    java,多线程实验.zip

    Java并发包提供了线程安全的集合类,如ArrayList的并发版本Vector,HashMap的并发版本ConcurrentHashMap等。 总结,Java多线程实验涉及的内容广泛,包括线程的创建与管理、同步与通信、线程池的使用、线程调度策略...

    c# ArrayList的使用方法小总结

    如果需要线程安全的ArrayList,可以使用`ArrayList.Synchronized`静态方法,它返回一个线程安全的ArrayList包装器。然而,这并不保证枚举操作的线程安全,因此在多线程环境中遍历ArrayList时,仍然需要手动锁定`...

    java实验04.docx

    - ArrayList和Vector都是动态数组,但Vector是线程安全的,它的所有操作都是同步的,而ArrayList不是。因此,在多线程环境下,如果不需要线程安全,通常推荐使用ArrayList,因为它有更好的性能。 4. **Set接口及其...

    实验七:Java集合与泛型

    Vector与ArrayList类似,但它是线程安全的,不过在多线程环境中,由于同步开销,性能通常低于ArrayList。 Set接口及其实现类HashSet和TreeSet也是实验的重点。HashSet是基于HashMap实现的,它不保证元素的顺序,不...

    多线程.rar

    4. **线程安全类**:如ArrayList不是线程安全的,而Vector和CopyOnWriteArrayList是线程安全的,比较它们在多线程环境下的优劣。 5. **死锁示例**:模拟死锁情况,分析并解决死锁问题,理解死锁条件。 6. **线程...

    javaAPI学习总结

    - 如果不需要线程安全,ArrayList是更好的选择,因为它提供更快的读取速度。 - 在遍历集合时,Iterator是通用且推荐的方式,但需要注意并发环境下的线程安全。 在实际开发中,根据需求选择合适的集合类和接口至关...

    云大java实验,试验1-12,

    在“云大java实验”中,实验1至实验12很可能是逐步递进的,旨在让学生从基础开始,逐步了解并熟练掌握Java的核心概念和技术。以下是对这些实验可能涉及的一些关键知识点的详细解释: 1. **Java环境配置**:实验可能...

    java2实验教程第6版实验指导书

    1. **Chapter 1:Java入门** - Java开发环境的搭建,如安装JDK,配置环境变量。 - 第一个Java程序的编写与运行,理解"Hello, World!"程序的含义。 - Java编程基础,包括数据类型、变量、常量、运算符。 2. **...

    Java-OOP.zip_java oop 实验

    Java提供了一些线程安全的数据结构,如ConcurrentHashMap和ArrayList的并发版本(CopyOnWriteArrayList)。 8. **线程通信**:Java的`wait()`、`notify()`和`notifyAll()`方法用于线程间的通信,它们必须在同步块或...

    Java《面向对象程序设计》实验报告五

    1. ArrayList对象的创建与操作: - 在实验的第一部分,定义了两个字符串数组`mpgStr[]`和`pngStr[]`,并将它们的元素交替添加到一个ArrayList对象`list`中。这展示了ArrayList如何作为动态数组,可以方便地添加元素...

    java实验04.pdf

    这有助于理解ArrayList的动态增长特性和与Vector的区别,后者是线程安全但效率较低。 第二部分涉及到Map接口,特别是HashMap和HashTable。实验要求创建一个HashMap,用于存储键值对,并添加特定的键值对。然后遍历...

    JAVA课程基础实验题

    实验1和实验3(内部类)虽然没有具体描述,但可以推测它们可能包括Java的基础语法和高级特性,比如匿名类、局部内部类、成员内部类等,这些都是编写复杂Java代码时经常用到的工具。 这些实验题覆盖了Java编程的广泛...

    Java程序设计:实验八 集合类.doc

    ArrayList和Vector的主要区别在于,ArrayList是可变大小的动态数组,而Vector是可变大小的动态数组,但它是线程安全的。 在实验中,我们使用ArrayList来存储客户的邮件地址。我们首先创建了一个ArrayList对象,然后...

    JAVA2实用教程(第5版)课后习题电子版

    1. Java基础: - 变量与数据类型:Java提供了八种基本数据类型,以及类、接口和数组等复杂类型。变量是存储数据的容器,了解它们的声明、初始化和使用是Java学习的基础。 - 控制结构:包括条件语句(if-else,...

    兰州大学java实验10

    5. **多线程**:Java支持并发编程,实验可能涉及到线程的创建、同步、通信等。理解Thread类和Runnable接口,以及synchronized关键字和wait/notify机制是实验的重点。 6. **泛型**:泛型是Java 5引入的新特性,用于...

    Java实验报告

    - `StringBuffer` 类:可变的字符序列,线程安全,适用于多线程环境下的字符串操作。 - `StringTokenizer` 类:用来将字符串分割成一系列的标记。 2. **日期类**: - `Date` 类:表示特定的瞬间,精确到毫秒。 ...

Global site tag (gtag.js) - Google Analytics