
多线程
文章平均质量分 79
weixin_42462255
这个作者很懒,什么都没留下…
展开
-
并发编程
并发编程 查看进程和线程 linux 进程 ps -fe //查看java进程 ps -fe | gropu java //使用管道运算符筛选java进程 jps //jdk自带命令,查看进程windows也可用 kill pidxxx //杀掉进程 线程 top -H -p pidxxx //查看进程下的所有线程 jstack pidxxx //抓取某一刻的线程信息 栈与栈帧 main线程运行时内存图,栈是线程私有的,所以此处只给线程main分配一个栈 线程上下文切换 即多个线程轮流使用cpu原创 2021-03-24 23:16:29 · 135 阅读 · 0 评论 -
synchronize详解
monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结 束处和异常处,JVM要保证每个monitorenter必须有对应的monitorexit与之配对 别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状 态和重量级锁状态, synchronized 一、偏向锁 适合只有一个线程在临界区执行 有两个线程1和2拥有同一个对象锁,假如线程1先进入临界区发现锁对象的markword后三位是100(即偏向无锁),就会进行cas操作把线程id存储在markword中,原创 2021-03-24 23:14:28 · 237 阅读 · 0 评论 -
volatile与单例模式
文章目录可见性解决方法Balking模式+两阶段终止模式有序性为什么要进行指令重排指令重排带来的问题如何保证有序性单例模式-volatile保证有序性的实践 volatile可以保证可见性和有序性。 可见性:禁止了JVM的缓存优化 有序性:禁止了JVM的重排序 可见性 static boolean run = true; public static void main(String[] args) { Thread t = new Thread(()->{ while(r原创 2021-02-01 18:25:11 · 267 阅读 · 0 评论 -
乐观锁-无锁并发
文章目录无锁问题提出为什么不安全解决思路-锁解决思路-无锁CAS与volatileCASvolatile为什么无锁效率高乐观锁和悲观锁原子类1、原子引用类2、ABA3、原子数组Unsafe 无锁 问题提出 一个账户内有10000,1000个线程每个线程减去10,最后正确的结果应该是0。 public interface Account { Integer getAmount(); void withdraw(Integer amount); public static void d原创 2021-01-27 19:50:13 · 238 阅读 · 1 评论 -
自定义线程池
线程池 自定义线程池的工作流程: 线程池刚开始没有线程时,当一个任务提交给线程池后,线程池会创建出一个新的线程来执行任务 当线程数达到coreSize时还没有线程空闲,这时再加入的任务就被放进队列中等待被空闲的线程执行 线程池的目的就是让一个线程执行多个任务,达到线程的重复利用 步骤1:自定义任务队列 public class BlockedQueue<T> { //队列的容量 private int capacity; //用来存放任务 private De原创 2021-01-27 13:01:19 · 266 阅读 · 0 评论 -
共享模型之内存
共享模型之内存 JMM JMM有以下几方面 1、原子性:指令不会受上下文切换的影响 2、可见性:不受cpu缓存的影响 3、有序性:保证指令不会受cpu指令并行优化的影响 可见性 volatile修饰成员变量和静态变量。避免线程从缓存中获取值。 synchronized既可以保证原子性也可以保证线程的可见性:对同一锁锁定的变量是可见的 问题:system.out.println()为什么可以导致可见性 balking模式 应用场景: 保证监控程序只运行一次 有序性 只要共享变量完全在synchronized中原创 2020-12-02 16:45:26 · 72 阅读 · 0 评论