近期学习内容
进程和线程的关系和区别
java里面多线程创建的方式
卖票问题的java代码实现synchronized和ReentrantLock
线程之间的通信同过wait和notifyAll完成(synchronized),
ReentrantLock需要使用Condition condition = lock.newCondition();来完成,对应其中方法condition.await();condition.signalAll();
有个细节时wait方法会照常虚假唤醒,线程在哪里等待,就在哪里苏醒,所以下面代码的if判断除了第一次都会失效
lock.lock();
try {
if (num != 0) {
condition.await();
}
num++;
System.out.println(Thread.currentThread().getName() + "::" + num);
condition.signalAll();
} finally {
lock.unlock();
}
解决方案就是把if换成while
多线程中使用List也造成安全问题
常见的解决方案是
- Vector
- Collections.synchronizedList(strings);
- CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList<>();
其中第三种最常见用的多.第三中用到了写时复制技术
多线程中使用HashSet也造成安全问题
解决方案:CopyOnWriteArraySet
CopyOnWriteArraySet stringHashSet=new CopyOnWriteArraySet<>();
多线程中使用HashMap也造成安全问题
解决方案ConcurrentHashMap
ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();