一、什么是线程安全?
代码在多线程下执行和在单线程下执行都能获得一样的结果。例子:以下程序是线程安全的吗?
public class RunnableImpl implements Runnable{ private int numbers= 100; @Override public void run() { while(true){ if(numbers>0){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } numbers--; } } } }二、解决线程安全的一般手段
锁 (synchronized、volatile、Lock)队列(并发包中提供的Atomic原子类)二、Java中那些类或者集合是线程安全的?
类:String、Integer、Long、StringBuffer、Properties。 集合:vector、statck、hashtable、enumeration。
考点:
stringBuffer是线程安全,而stringBuilder是线程不安全的。hashtable是线程安全的(同步机制);hashmap不是线程安全的,hashtable不允许插入空值,hashmap允许三、绝对线程安全的类(list、set) CopyOnWriteArrayList、CopyOnWriteArraySet(深入理解需要查看源代码)
考点:写一个线程安全的List List list = Collections.synchronizedList(new ArrayList());