如果在多线程下,同时操作同一个数据源,就会出现数据安全问题:
A线程取出值为10,准备加5.
同时B线程也取出来10,减了5
C取出的时候有可能时15,也有可能时5。产生了数据安全问题。
方法有很多例如:
1、自己写一个
synchronized或者lock包裹方法的数据类static class t {List<String> list = new ArrayList<>();synchronized void add(String val) {list.add(val);}synchronized void pringt() {System.out.println(list);}}
2、也是可以,或者用java的安全类:
CopyOnWriteArrayList类在添加时会将数据copy复制一份,添加完毕后再赋值回原容器中。同理,set集合也是这样CopyOnWriteHashSet类
3、还有一种就是使用Vector,就是和我第一种方法一样,使用给方法加锁。
而map则是直接使用ConcurrentHashMap或者HashTable(比较慢)