Java 并发详解 ③:Synchronized
synchronized 发生异常会释放锁
不能拿 String、Integer、Long 等基础类型做锁
synchronized 和 Lock 能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。但是同步块里的非原子操作依旧可能发生指令重排
synchronized 发生异常会释放锁
不能拿 String、Integer、Long 等基础类型做锁
synchronized 和 Lock 能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。但是同步块里的非原子操作依旧可能发生指令重排
线程数计算公式: 线程数 = CPU 核数 * 期望 CPU 使用率 0~1_ *_(1 + 等待时间 / 计算时间)
1 | ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, |
allowCoreThreadTimeOut
。corePoolSize
时,非核心线程在终止之前等待新任务的最大时间。keepAliveTime
参数的时间单位。execute
方法提交的 Runnable
任务。提交的线程后若发现线程总数超过 corePoolSize
但是不超过 keepAliveTime
的情况下。继承 Thread 类
1 | public class SubThread extends Thread { |
实现 Runnable 接口
1 | public class PrintNum1 implements Runnable { |
实现 Callable 接口
与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装
1 | public class MyCallable implements Callable<Integer> { |
深入学习 JVM-JVM 安全点和安全区域
垃圾收集主要是针对 堆 和 方法区 进行
程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收
简历:熟悉 GC 常用算法,熟悉常见垃圾回收器,具有实际 JVM 调优实战经验
被强引用关联的对象不会被回收。
1 | Object obj = new Object(); |
被软引用关联的对象只有在内存不够的情况下才会被回收。
作用: 缓存
1 | Object obj = new Object(); |
// ===== 软引用测试(-Xms:20M -Xmx20M) =====
SoftReference<byte[]> m = new SoftReference<>(new byte[1024102410]);
System.out.println(m.get());// 再分配一个数组,heap 将装不下,这时候系统会垃圾回收,先回收一次,如果不够,会把软引用干掉
byte[] b = new byte[1024102415];
System.out.println(m.get()); // null