线程安全 集合

线程安全指的是该对象的add,remove,get等方法是线程安全的,即同一对象(同一个list),同一时间只有一个线程能在这几个方法上运行,其实针对的是这个集合list 这几种方法内容而言的,如list的add方法,这个add方法里面具体实现肯定有好多条代码,假如一个线程调用add方法,其实是在执行这个add方法里的具体实现的代码,再不停的执行代码过程中,完全有可能有另外一个线程也来执行这个list的add方法,也就是也会进这个list的add方法的具体实现代码中,那这个时候由于对象都是同一个list,而且都是执行的add方法,那可能就会涉及同步问题,那这里线程安全集合就是指 当一个线程在调用 这个集合的add或者remove或get等方法时,其他都线程就不能来调用这个list的这些方法中的任意一个,这样子就能保证数据的稳定性,但这只是集合的原子级别,不能概括了 业务层,所以业务层次仍然要加锁,比如一个线程安全的map,2个线程都来put操作,如果仅仅直接put的话是没问题,因为哪个先调用put,另外一个线程就只能等待调用put,这是没问题的,但假如 2个put操作是建立在一个if条件下,比如如果 是map中套map ,假如 外部的key对应的value即里面的map 不存在才会去new这个里面map然后把这个里面map put到外部map,这个时候就要加锁。

但迭代器不是这样的.每个迭代器实际上都是独立的对象,互相之间是没有办法用锁来同步的(锁只能锁同一个对象),也不能去同步(因为迭代器设计之初就是为了支持多个遍历动作同时存在的).于是,在同一个List的两个不同迭代器在不同线程上分别遍历以及进行remove动作时,就会出现线程不安全的问题.如果要避免这个问题,就要在遍历时用list对象作为同步锁来保证线程安全.

posted @ 2015-04-11 17:48  wzhanke  阅读(319)  评论(0编辑  收藏  举报