如果在多线程下,同时操作同一个数据源,就会出现数据安全问题:
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(比较慢)