精华帖 (0) :: 良好帖 (5) :: 新手帖 (6) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-02-28
NanguoCoffee 写道 ironsabre 写道 NanguoCoffee 写道 ironsabre 写道 原子和线程安全的区别是什么,你说来听听。
嘿嘿,原子的肯定是线程安全的。 线程安全的不一定是原子的。 囧死了,我在说废话~~~~ 你能举例说明吗。 我觉得你说的不对,你举出例子来我应该可以反驳你。 ”原子的肯定是线程安全的“ 这句话就不用举例。 “线程安全的不一定是原子的”的例子: String对象,Date对象,Integer, Double.... 这些类貌似有一种叫法:不可变类 Vector按你的分类应该叫什么?原子or线程安全? |
|
返回顶楼 | |
发表时间:2011-02-28
haigui.chen 写道 我觉得你应该说Vector所有的方法是“原子”的,我其实是没懂你脑子里面的“线程安全”怎么定义的...
引用 还没太懂,同步和线程安全是两个不同的概念... 多线程同时直接操作一个Vector,做add操作。不会有报错。 1000个add后,vector里就有1000个数据。 多线程同时直接操作一个ArrayList,做add操作。有可能报错,也有可能出现数据被重写掉。 1000个add后,vector里只有999个数据。或者执行期间有index异常。 Vecotr的所有方法都是线程安全的。ArrayList不是。 我不知道你哪儿不懂。 你错了。 我脑子里的线程安全定义就是标准定义。 在多线程和单线程下工作,Vector的所有API(同步的)能表现出一致的行为,而ArrayList的API不能。 |
|
返回顶楼 | |
发表时间:2011-02-28
class RealTimeClock
{ private int clkID; public void setClockID(int id) { clkID = id; } } 在这里,setClockId不需要同步,也能保证线程安全。这是由于int的赋值操作是原子的。这并不多可以理解为Java本身对他提供了同步的默认支持。 官方说法如下:32位或者更少位数的赋值是原子的。 如果把上面的int改成long(64位)。那么setClockId就不再是原子操作。也线程不再安全。如果要保证,那么加上synchronized。 当然后来jdk里Java又提供了一个AtomicLong之类的对象,这些对象能提供原子操作。 其实在讨论Vector和ArrayList的时候,是不需要出现到关于原子操作的讨论的。 它们俩跟原子操作就没关系。 |
|
返回顶楼 | |
发表时间:2011-02-28
在多线程调用ArrayList的add方法的时候,就会出现问题,而Vector不会。确实Vector是线程安全的。只是这个安全,作用不够明显。
|
|
返回顶楼 | |
发表时间:2011-02-28
我觉得这个问题根本没讨论的必要。
vector是线程安全的,就如同一个房间,房门上有把锁,锁只有一个钥匙,当很多人想进房间,拿到那把能开锁的钥匙(姑且叫做A)才可以进入房间,而等到A退出房间并将钥匙随便给到在房门口等待的其他一人(姑且叫做B)的手上,B才可以进入房间,这样能保证房间里的资源在同一时间只被一个人占用。 arrayList不是线程安全的,就如同一个房门上没有锁的房间,因而所有的人都可以同时进入房间,房间里的资源在同一时间被多个人占用。这样在多线程中会出现问题。比如说那个资源是马桶,多个人进去抢那一个马桶势必大大出手形成竞争(race condition)。这样说不准没有一个人能正常如厕,所以arrayList在多线程里面用的话会很危险。 反过来看楼主的说法,楼主用多个线程来查看vector,然后再往vector里面添加数据。 if(vector.size() == 0){ Thread.sleep(100); vector.add(new Element()); } 我故意加了个Thread.sleep(); 这样会存在什么问题呢,多个线程都会看到vector的空间等于0,然后往vector里面添加元素。就如同多个人看到房间里面的马桶一次都没有用过,于是都想用第一次,然后他们该怎么做呢?排队拿钥匙进入房间用马桶。于是马桶被用了3次。 而如果在这里是arrayList会是什么情况呢?所有的人都进去用,有可能马桶只被用了1次(arrayList里面只存用一个元素)。那为什么明明3个人用过马桶,最后却只被用了一次呢,这个与试试矛盾啊,这就是因为房门没有锁,3个人有可能同时共用了一次马桶,这个与事实想违背,所以说arrayList是不安全的。 那么楼主说vector也是不安全的 因为上面的一段代码,这段代码就好比是房间(1)外面有一个更大的房间(2),房间(2)的房门没有锁,所以所有的人都可以进入房间(2)来看,这样房间(2)是不安全的,不安全的原因是楼主没把房间上锁,但是房间(2)不安全并不代表房间(1)不是安全的。 |
|
返回顶楼 | |
发表时间:2011-02-28
楼上讲得很好。
|
|
返回顶楼 | |
发表时间:2011-12-06
帖子还没看完,
我基本上总结下, JDK API描述的小城安全 ,是指vector里的方法, 与Mylist 的业务应用无关】 最后还是的得靠程序员去实现。 |
|
返回顶楼 | |
发表时间:2011-12-06
@windrain453 说的好
|
|
返回顶楼 | |
发表时间:2011-12-09
windrain453 写道 我觉得这个问题根本没讨论的必要。
vector是线程安全的,就如同一个房间,房门上有把锁,锁只有一个钥匙,当很多人想进房间,拿到那把能开锁的钥匙(姑且叫做A)才可以进入房间,而等到A退出房间并将钥匙随便给到在房门口等待的其他一人(姑且叫做B)的手上,B才可以进入房间,这样能保证房间里的资源在同一时间只被一个人占用。 arrayList不是线程安全的,就如同一个房门上没有锁的房间,因而所有的人都可以同时进入房间,房间里的资源在同一时间被多个人占用。这样在多线程中会出现问题。比如说那个资源是马桶,多个人进去抢那一个马桶势必大大出手形成竞争(race condition)。这样说不准没有一个人能正常如厕,所以arrayList在多线程里面用的话会很危险。 反过来看楼主的说法,楼主用多个线程来查看vector,然后再往vector里面添加数据。 if(vector.size() == 0){ Thread.sleep(100); vector.add(new Element()); } 我故意加了个Thread.sleep(); 这样会存在什么问题呢,多个线程都会看到vector的空间等于0,然后往vector里面添加元素。就如同多个人看到房间里面的马桶一次都没有用过,于是都想用第一次,然后他们该怎么做呢?排队拿钥匙进入房间用马桶。于是马桶被用了3次。 而如果在这里是arrayList会是什么情况呢?所有的人都进去用,有可能马桶只被用了1次(arrayList里面只存用一个元素)。那为什么明明3个人用过马桶,最后却只被用了一次呢,这个与试试矛盾啊,这就是因为房门没有锁,3个人有可能同时共用了一次马桶,这个与事实想违背,所以说arrayList是不安全的。 那么楼主说vector也是不安全的 因为上面的一段代码,这段代码就好比是房间(1)外面有一个更大的房间(2),房间(2)的房门没有锁,所以所有的人都可以进入房间(2)来看,这样房间(2)是不安全的,不安全的原因是楼主没把房间上锁,但是房间(2)不安全并不代表房间(1)不是安全的。 太牛逼了。 |
|
返回顶楼 | |
发表时间:2011-12-09
这东西面试时确定很经常问到的
|
|
返回顶楼 | |