目录
01 java提供的线程安全自增方法
private AtomicLong atomicLong = new AtomicLong(1);//给一个初始值: 1
atomicLong.getAndIncrement();// 等效a++ :1
atomicLong.incrementAndGet();// 等效++a :2
02 线程安全的List集合
private static List<String> cache = new Vector<>();//不推荐使用(影响性能)
//乐观锁 不会有线程异常了 但是数据依然存在重复
private static CopyOnWriteArrayList<String> cache = new CopyOnWriteArrayList<>();
03 锁 双重校验(类单例模式)
代码了解单例模式: ->
单例模式: 懒汉式 饿汉式 登记式(Spring的IOC) 亲测(多线程测试)_pingzhuyan的博客-CSDN博客
private static CopyOnWriteArrayList<String> cache = new CopyOnWriteArrayList<>();
//优化 加一个校验
private static List<String> selectAll() {
if (cache.isEmpty()){
synchronized (cache){//同步代码块
if (cache.isEmpty()) {
System.out.println("======>IMITATION GET DATA FROM DATABASE <=======");
List<String> cates = Arrays.asList("CateGory-A", "CateGory-B", "CateGory-C");
cache.addAll(cates);
}
}
}
//模拟数据库请求数据, 添加到本地缓存中
return cache;
}
04 读写锁
其他锁简介(其他人的文章):
悲观写 乐观读
这么理解 : 共享排他锁(共享独占锁) ”,“多读锁”或者“单写多读锁"
想写 -> 必须等着没有读者 没有写者才可以用 (读写互斥)
--> 模拟注册中心 注册和拉取配置
private static Map<String, String> registryMap = new ConcurrentHashMap<>();
private static final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
//服务的注册
public static void doRegist(String serviceId, String host) { //悲观写
readWriteLock.writeLock().lock(); //写锁
try {
registryMap.put(serviceId, host);
} finally {
readWriteLock.writeLock().unlock();//需要手动释放写锁
}
}
//服务的发现(查找)
public static String doLookup(String serviceId) { //乐观读
// System.out.println(serviceId);
try{
readWriteLock.readLock().lock();
return registryMap.get(serviceId);
}finally {
readWriteLock.readLock().unlock();
}
}