Skip to content

Commit

Permalink
20241020
Browse files Browse the repository at this point in the history
  • Loading branch information
CompetitiveLin committed Oct 20, 2024
1 parent 9c35b59 commit 0655466
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
15 changes: 9 additions & 6 deletions _posts/2022-06-21-java.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ As-if-serial的意思是所有的语句都可以为了优化而被重排序,

双亲委派机制概念:双亲委派机制是指当一个类加载器收到某个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,它会先委托父类加载器在自己的搜索范围内找不到对应的类时,该类加载器才会尝试自己去加载。

双亲委派机制的作用:保证Java类的加载的一致性和安全性,避免了类的重复加载和恶意代码的替换。

Tomcat中的类加载器:

- Tomcat自身所使用的类加载器,会加载jre的lib包及tomcat的lib包的类,遵循双亲委派机制。加载顺序:(1).先从缓存中加载;(2).如果没有,则从JVM的Bootstrap类加载器加载;(3).如果没有,则从父类加载器加载,加载顺序是AppClassLoader、Common、Shared。(4).如果没有,则从当前类加载器加载(按照WEB-INF/classes、WEB-INF/lib的顺序);
Expand Down Expand Up @@ -241,7 +243,7 @@ Garbage First(G1)收集器:

![](https://raw.githubusercontent.com/CompetitiveLin/ImageHostingService/picgo/imgs/202305091525435.png)


一个线程 OOM 后,其他线程仍能正常运行,因为 OOM 之前会 GC,释放掉资源。


# [JVM调优](https://cloud.tencent.com/developer/beta/article/1812722)
Expand Down Expand Up @@ -437,6 +439,7 @@ JDK8:**对table数组的头节点加锁**(哈希桶为空时,使用CAS将
3. 如果判断有其他线程正在对ConcurrentHashMap扩容(hash==MOVED),获取要去获取新的tab,进入下次循环;
4. 找到了对应哈希桶的首节点f,直接**对f加synchronized同步**,然后判断f节点是链表结构还是红黑树结构,链表结构则遍历链表进行设置,红黑树则采用红黑树设置进去。设置成功后判断是否需要把链表结构转红黑树;

- get: 大部分情况下不加锁,是通过 volatile 修饰 Node 成员 val 保证的。与 volatile 修饰桶数组无关,桶数组用 volatile 修饰主要是保证在数组扩容的时候保证可见性。仅当节点为红黑树、正在变色旋转、查询非头节点时,会加基于 CAS 实现的读写锁。

ThreadLocal: 提供线程内的局部变量,在多线程的环境中保证各个线程内的变量不同。将数据封闭在线程中而避免使用同步,即线程封闭。一个ThreadLocal对象即是一个线程局部变量。jdbc连接池就是用ThreadLocal,典型例子。以下使四种方法:
- Object get():获取该线程局部变量的值。
Expand Down Expand Up @@ -628,9 +631,9 @@ java中静态属性和静态方法可以被继承,但是不能被重写,因
- List<T extends Serialzable & Cloneable> 擦除后类型为 List。

# [JDK 设计模式](https://www.cnblogs.com/vipstone/p/18361126)
1. 单例模式:Runtime 类使用饿汉式创建单例
2. 工厂模式:线程池中所有线程,通过工厂模式创建
3. 代理模式:`java.lang.reflect.Proxy` 中的动态代理
4. 迭代器模式:`java.util.Iterator` 使用迭代器遍历集合容器
5. 模板方法:AQS 中的 `acquire``release` 方法被独占式和共享式所重写
1. 单例模式:`java.lang` Runtime 类使用饿汉式创建单例
2. 工厂模式:`java.util.concurrent` ThreadFactory 接口使用工厂模式创建线程
3. 代理模式:`java.lang.reflect` Proxy 类使用动态代理
4. 迭代器模式:`java.util` Iterator 接口使用迭代器遍历集合容器
5. 模板方法:`java.util.concurrent.locks` AQS 中的 `tryAcquire`, `tryRelease`, `tryAcquireShared`, `tryReleaseShared` 方法被公平锁和非公平锁重写

2 changes: 1 addition & 1 deletion _posts/2023-07-06-redis.md
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ Redis的删除策略是**惰性删除+定期删除**。定期删除如果检查

### 近似 LRU 算法

出于节省内存的考虑,Redis 的 LRU 算法并非完整的实现,是一个基于哈希表的近似 LRU 算法,通过对少量键进行取样,然后回收其中的最久未被访问的键。通过调整每次回收时的采样数量 maxmemory-samples,可以实现调整算法的精度。
出于节省内存的考虑(不需要为所有数据维护一条大链表),Redis 的 LRU 算法并非完整的实现,是一个基于哈希表的近似 LRU 算法,通过对少量键进行取样,然后回收其中的最久未被访问的键。通过调整每次回收时的采样数量 maxmemory-samples,可以实现调整算法的精度。

## RedLock 红锁

Expand Down

0 comments on commit 0655466

Please sign in to comment.