- 浏览: 746606 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (419)
- 杂软粉墨 (2)
- 创意灵感 (3)
- 经验记录 (137)
- 开源轨迹 (2)
- sip-communicator (2)
- 闲侃杂谈 (8)
- 问题交流 (24)
- 概念模式 (32)
- 难点备案 (5)
- JwChat (1)
- 中国象棋 (1)
- 教育探索 (6)
- 英语研究 (58)
- 星际争霸 (1)
- 电信知识 (1)
- 软件架构 (3)
- 哲学探索 (26)
- 算法灵魂 (8)
- 近视探索 (6)
- 数学数学 (3)
- 牛角钻尖 (23)
- 至强文言 (3)
- 数据结构 (1)
- 宇宙物理 (2)
- 网络架构 (3)
- 游戏领域 (4)
- 图形处理 (2)
- 修炼之路 (8)
- 读书天地 (20)
- 编解乱码 (2)
- 概念探索 (8)
- 格物致知 (1)
- 其它语言 (1)
- 测试领域 (3)
- 文化风流 (1)
- JQuery (1)
- 網頁領域 (1)
- Unix/Linux (1)
- Inside JVM (1)
- 异常分析 (1)
最新评论
-
suyujie:
引用
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
iamzhoug37:
您能说一下"局部变量不受文本顺序限制" 是 ...
声明前为什么能赋值却不能输出,都是使用
import java.util.ArrayList; import java.util.List; //实现Runnable接口的线程 public class HelloThread implements Runnable { String name; List<String> v; HelloThread(String name, List<String> v) { this.name = name; this.v = v; } public void run() { System.out.println(name + "start"); while(true) { v.add(name + ".add"); System.out.println(name + " list size is " + v.size()); try { Thread.sleep(10); } catch(InterruptedException e) { System.out.println(e.getMessage()); } } } public static void main(String args[]) throws InterruptedException { List<String> v = new ArrayList<String>(); HelloThread hello1 = new HelloThread("hello1", v); HelloThread hello2 = new HelloThread("hello2", v); HelloThread hello3 = new HelloThread("hello3", v); Thread h1 = new Thread(hello1); Thread h2 = new Thread(hello2); Thread h3 = new Thread(hello3); h1.start(); h2.start(); h3.start(); } }
结果:
hello3start
hello3 list size is 1
hello1start
hello1 list size is 2
hello2start
hello2 list size is 3
hello3 list size is 4
hello1 list size is 5
hello2 list size is 4
hello3 list size is 6
hello1 list size is 8
hello2 list size is 7
hello1 list size is 9
hello3 list size is 10
hello2 list size is 9
加了12次,但size却只有10,不安全
改成号称线程安全的Vector:
import java.util.Vector; //实现Runnable接口的线程 public class HelloThread implements Runnable { String name; Vector<String> v; HelloThread(String name, Vector<String> v) { this.name = name; this.v = v; } public void run() { System.out.println(name + "start"); while(true) { v.add(name + ".add"); System.out.println(name + " vector size is " + v.size()); try { Thread.sleep(10); } catch(InterruptedException e) { System.out.println(e.getMessage()); } } } public static void main(String args[]) throws InterruptedException { Vector<String> v = new Vector<String>(); HelloThread hello1 = new HelloThread("hello1", v); HelloThread hello2 = new HelloThread("hello2", v); HelloThread hello3 = new HelloThread("hello3", v); Thread h1 = new Thread(hello1); Thread h2 = new Thread(hello2); Thread h3 = new Thread(hello3); h1.start(); h2.start(); h3.start(); } }
结果:
hello1start
hello1 vector size is 1
hello2start
hello2 vector size is 2
hello3start
hello3 vector size is 3
hello1 vector size is 4
hello2 vector size is 5
hello3 vector size is 6
hello1 vector size is 7
hello2 vector size is 8
hello3 vector size is 9
hello1 vector size is 10
hello2 vector size is 11
hello3 vector size is 12
hello1 vector size is 13
hello3
vector
size is 15
hello2
vector
size is 15
hello1 vector size is 16
也出现了线程不安全现象吗?不是的
这个不算线程不安全,加了16次,size是16,恰恰是线程安全的表现,只不过是待两个线程都add完了之后才调的size(),所以都是15,跳过了14。
以上一样的程序多试几次就出现了,另外关于Vector的thread-safety
All Vector methods are synchronized themselves, so as long as you are
only synchronizing around a single method, your own synchronization is
not necessary. If you have several method calls, which depend on each
other, e.g. something like vec.get(vec.size()-2)
to get the
second last element, you have to use your own synchronization since
otherwise, the vector may change between vec.size() and vec.get().
所有的Vector的方法对它们自己而言都是 synchronized的,所以如果只要同步单个方法,自己额外添加的同步措施就失去必要了。如果有几个方法需要调用,且它们互相存在依赖,比如 vec.get(vec.size()-2),是要得到倒数第二个元素,那么就必须加上自己的同步措施,因为否则的话,vector有可能在 vec.size() 和 vec.get() 之间发生改变
评论
ArrayList有时会出现越界异常
java.lang.ArrayIndexOutOfBoundsException:
Vector则不会
我想这可能是Vector和ArrayList的本质区别
发表评论
-
RuntimeException为啥不用声明抛出?
2012-11-13 15:04 7459异常,错误都是同一种父类:java.lang.Throwabl ... -
why null is allocated on java stack
2012-06-05 11:45 1187提问: 恩。。。俺的意思是, String str = n ... -
关于Java 泛型 ?extends T 的问题
2012-05-21 11:05 4354http://topic.csdn.net/u/2012051 ... -
HashSet的contains方法de解释是不是有问题
2011-02-20 22:27 3267first of all, exhibits the code ... -
hashcode中选择31因子的原因
2010-12-24 13:57 1478源自<<effective java 2nd> ... -
为什么AnonymousInnerClass只能访问final型非同一方法局部变量
2010-09-13 09:39 1443import java.io.IOException; im ... -
URLConnection访问servlet无反应
2010-07-26 09:28 2677这样完整的回路是ok的 客户端 import jav ... -
This is how scientists see the world
2010-07-14 15:36 1007有些东西不清楚,比如右上角什么东东,中间那个看似压强C, ... -
接口能描述成has-a吗
2010-07-10 10:19 1332接口has a什么呢? 如果说接口当作具备某种能力来用,比如X ... -
关于java.util.ResourceBundle
2010-07-05 14:17 4352import java.util.ResourceBundle ... -
SortedSet去重
2010-06-13 17:06 1334import java.util.Iterator; imp ... -
这个静态内部类实现的单例是迟加载且线程安全的吗?
2010-05-28 13:10 1630public class JiveProperties { ... -
double-checked locking实现的单例模式之volatile
2010-05-26 17:23 3511private volatile static Singlet ... -
死锁的例子描述对吗
2010-05-10 11:20 1101public class Deadlock { stati ... -
java中Adapter是什么概念
2010-04-06 11:30 4938Adapter乃适配器, ... -
编码转换会丢失信息吗
2010-03-09 13:13 1251编码转换会丢失信息吗? 这是个命题,根 ... -
文本文件在系统中的存储与展现方式
2010-02-04 09:38 1132碰到了一个问题,同样的一个properties ... -
servlet如何实现多线程访问同一个实例的多个service方法
2009-12-09 11:22 1622如题,这是我现在想的一个问题,暂存于此,它同一个方法的 ... -
构造方法是静态的吗?
2009-12-03 15:13 1434public class Test { private ... -
关于JTextPane读取RTF多出一行的问题
2009-11-11 11:20 2464代码如下: import java.io.FileInput ...
相关推荐
在Java编程语言中,ArrayList、...而Vector虽然提供了线程安全,但其性能通常低于ArrayList和LinkedList,更适合于多线程环境且对性能要求不那么敏感的应用。在实际开发中,选择哪种数据结构应根据具体需求来决定。
尽管`Vector`在Java集合框架中已经被`ArrayList`和`LinkedList`等更高效的类取代,但它的线程安全性使其在多线程编程的示例中仍然有用。不过,实际生产环境中的线程池实现往往会选择更高效的数据结构,例如`...
同时,了解这些类的并发性和线程安全性也是很重要的,尤其是在多线程环境中。 总之,设计并执行性能测试是评估和选择合适集合实现的关键步骤。通过深入研究源码和构建测试框架,我们可以根据具体需求选择最高效的...
1. 线程安全性:Vector是线程安全的,内部使用`synchronized`修饰方法,适合多线程环境;而ArrayList不是线程安全的,如果在多线程环境下使用,需要自行同步。 2. 性能:由于线程安全的实现,Vector的性能相对较低,...
同时,Java容器类如Vector、Hashtable等是线程安全的,它们内部封装了同步机制,而像ArrayList、HashMap等则不是线程安全的,需要程序员自行处理同步问题。 Java中还可以使用Thread类提供的方法如start()、current...
3. **线程安全性**: - 默认情况下,`LinkedList`不提供线程安全的实现。如果需要在多线程环境中使用,可以通过`Collections.synchronizedList`方法将其转换为线程安全的列表。 #### 四、结论 综上所述,在选择...
ArrayList不是线程安全的,如果需要线程安全,应该考虑使用Vector或Collections.synchronizedList()进行同步包装(d正确,a和c错误)。 10. LinkedList是双链表实现的集合类,它的特点是增删元素速度快,但查询速度...
7. **Vector类**:Vector是JDK 1.0引入的,是一个线程安全的动态数组,但随着JDK的发展,ArrayList(非线程安全,但在单线程环境中性能更好)逐渐取代了Vector。然而,某些旧项目中仍然可能存在对Vector的使用。 8....
- Vector 主要在一些遗留系统或者对线程安全性有特殊需求的情况下仍然会被使用。 ### 六、ArrayList 和 LinkedList 的特性 1. **ArrayList**: - 底层采用数组实现。 - 查询速度快,因为可以通过索引直接访问...
Vector是线程安全的,但由于其同步机制,性能相对较低。 - **LinkedList**:它是双向链表结构,适合频繁进行插入和删除操作,但在随机访问上效率低于ArrayList和Vector。 - **Hashtable与HashMap**:两者都是Map...
不同之处在于,`Vector`的每个公共方法都被同步化,确保了在多线程环境下的安全性。这意味着当一个线程正在执行某个操作(如添加、删除或修改元素)时,其他线程会被阻塞,直到该操作完成。然而,这种全局的同步可能...
Vector与ArrayList类似,也是基于数组实现,但它线程安全。每个方法都加了synchronized关键字,确保多线程环境下操作的正确性。然而,这也会带来性能开销,所以在单线程环境中,ArrayList通常优于Vector。如果确实...
7. **线程安全**:ArrayList不是线程安全的,如果在多线程环境下使用,需要进行同步控制,或者选择使用线程安全的`Vector`类。 8. **ArrayList与LinkedList的比较**:LinkedList是另一种List实现,它的插入和删除...
1. `ArrayList`与`Vector`:两者都是动态数组,但`Vector`是线程安全的,性能较低;`ArrayList`则在非并发环境下更快。 2. `LinkedList`:线程不安全,适用于频繁插入和删除的场景。 3. `ConcurrentHashMap`:并发...