事实不像想象中的那样,实践,体会的才深。
被覆盖输出
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; } } } }
相关推荐
- 使用线程安全的数据结构,如ConcurrentHashMap,ArrayList的线程不安全,应使用CopyOnWriteArrayList等替代。 以上是Java语言程序设计中关于多线程的基本知识点,理解和掌握这些内容对于编写高效、可靠的多线程...
这个游戏可以帮助开发者理解线程间的通信、同步以及线程安全问题。 1. **线程基础知识**: 线程是操作系统分配CPU时间的基本单元,一个进程可以有多个线程,它们共享同一块内存空间,各自执行不同的任务。在Java中...
6. **线程安全与非线程安全** - **线程不安全的实例**:如`StringBuilder`与`StringBuffer`,以及在并发环境下对静态变量的操作。 - **线程安全类**:如`Atomic*`系列,`Collections.synchronized*`系列。 7. **...
Java并发包提供了线程安全的集合类,如ArrayList的并发版本Vector,HashMap的并发版本ConcurrentHashMap等。 总结,Java多线程实验涉及的内容广泛,包括线程的创建与管理、同步与通信、线程池的使用、线程调度策略...
- ArrayList和Vector都是动态数组,但Vector是线程安全的,它的所有操作都是同步的,而ArrayList不是。因此,在多线程环境下,如果不需要线程安全,通常推荐使用ArrayList,因为它有更好的性能。 4. **Set接口及其...
Vector与ArrayList类似,但它是线程安全的,不过在多线程环境中,由于同步开销,性能通常低于ArrayList。 Set接口及其实现类HashSet和TreeSet也是实验的重点。HashSet是基于HashMap实现的,它不保证元素的顺序,不...
4. **线程安全类**:如ArrayList不是线程安全的,而Vector和CopyOnWriteArrayList是线程安全的,比较它们在多线程环境下的优劣。 5. **死锁示例**:模拟死锁情况,分析并解决死锁问题,理解死锁条件。 6. **线程...
- 如果不需要线程安全,ArrayList是更好的选择,因为它提供更快的读取速度。 - 在遍历集合时,Iterator是通用且推荐的方式,但需要注意并发环境下的线程安全。 在实际开发中,根据需求选择合适的集合类和接口至关...
在“云大java实验”中,实验1至实验12很可能是逐步递进的,旨在让学生从基础开始,逐步了解并熟练掌握Java的核心概念和技术。以下是对这些实验可能涉及的一些关键知识点的详细解释: 1. **Java环境配置**:实验可能...
1. **Chapter 1:Java入门** - Java开发环境的搭建,如安装JDK,配置环境变量。 - 第一个Java程序的编写与运行,理解"Hello, World!"程序的含义。 - Java编程基础,包括数据类型、变量、常量、运算符。 2. **...
Java提供了一些线程安全的数据结构,如ConcurrentHashMap和ArrayList的并发版本(CopyOnWriteArrayList)。 8. **线程通信**:Java的`wait()`、`notify()`和`notifyAll()`方法用于线程间的通信,它们必须在同步块或...
1. ArrayList对象的创建与操作: - 在实验的第一部分,定义了两个字符串数组`mpgStr[]`和`pngStr[]`,并将它们的元素交替添加到一个ArrayList对象`list`中。这展示了ArrayList如何作为动态数组,可以方便地添加元素...
这有助于理解ArrayList的动态增长特性和与Vector的区别,后者是线程安全但效率较低。 第二部分涉及到Map接口,特别是HashMap和HashTable。实验要求创建一个HashMap,用于存储键值对,并添加特定的键值对。然后遍历...
实验1和实验3(内部类)虽然没有具体描述,但可以推测它们可能包括Java的基础语法和高级特性,比如匿名类、局部内部类、成员内部类等,这些都是编写复杂Java代码时经常用到的工具。 这些实验题覆盖了Java编程的广泛...
ArrayList和Vector的主要区别在于,ArrayList是可变大小的动态数组,而Vector是可变大小的动态数组,但它是线程安全的。 在实验中,我们使用ArrayList来存储客户的邮件地址。我们首先创建了一个ArrayList对象,然后...
1. Java基础: - 变量与数据类型:Java提供了八种基本数据类型,以及类、接口和数组等复杂类型。变量是存储数据的容器,了解它们的声明、初始化和使用是Java学习的基础。 - 控制结构:包括条件语句(if-else,...
5. **多线程**:Java支持并发编程,实验可能涉及到线程的创建、同步、通信等。理解Thread类和Runnable接口,以及synchronized关键字和wait/notify机制是实验的重点。 6. **泛型**:泛型是Java 5引入的新特性,用于...
- `StringBuffer` 类:可变的字符序列,线程安全,适用于多线程环境下的字符串操作。 - `StringTokenizer` 类:用来将字符串分割成一系列的标记。 2. **日期类**: - `Date` 类:表示特定的瞬间,精确到毫秒。 ...
理解它们的区别和使用场景,如线程安全、查找效率等,有助于编写更高效的代码。 函数式编程概念,如Lambda表达式和Stream API,可能也在实验中有所体现。这些现代特性让Java更具表现力,简化了多线程编程和数据处理...