代码改变世界

线程池ThreadPoolExecutor

2022-12-11 23:45 by 杭伟, 118 阅读, 0 推荐, 收藏, 编辑
摘要:回顾Java创建线程的几种方式: 1,继承Thread(实际Thread也是实现Runnable接口); 2,实现Runnable接口; 3,实现Callable接口(返回值); 4,由线程池创建。 根据阿里巴巴Java开发手册,关于并发编程有两个强制要求: 1.线程资源必须通过线程池提供,不允许在 阅读全文

Java线程中断机制

2022-12-08 09:53 by 杭伟, 42 阅读, 0 推荐, 收藏, 编辑
摘要:在阅读AQS源码以及juc包很多基于AQS的应用源码过程中,会遇到很多interrupted相关的方法,这里复习一下java线程中断相关。 要点:使用interrupt()中断一个线程,该方法只是标记中断,并不会马上中断。马上中断使用stop(),该方法已过期,不建议使用(立刻中断容易造成生产数据一 阅读全文

JVM有意思的图-持续更新

2022-12-07 19:11 by 杭伟, 12 阅读, 0 推荐, 收藏, 编辑
摘要:放一些JVM有意思的图 通过一行代码联想JVM: 阅读全文

ReentrantLock源码

2022-12-06 21:13 by 杭伟, 18 阅读, 0 推荐, 收藏, 编辑
摘要:ReentrantLock即是AQS线程同步队列器思想的具体应用/实现 实现了AQS,并有公平锁和非公平锁(默认非公平锁)两种实现 ReentrantLock有三个重要的内部类:Sync(抽象类),NonfaireSync(Sync的非公平锁实现),FairSync(Sync的公平锁实现) Sync 阅读全文

AQS原理

2022-12-06 18:05 by 杭伟, 87 阅读, 0 推荐, 收藏, 编辑
摘要:*前置知识: 1,线程的生命周期:新建(new())--就绪(start())--运行(run())--阻塞--死亡; 线程的非运行状态: 等待,挂起,睡眠,阻塞 正常生命周期中运行的线程,如果有同步需求,假如正在竞争一把锁,在没拿到锁时,应该被挂起。(而不是什么都不做) 2,在队列中的线程,应该处 阅读全文

Object o = new Object();

2022-12-05 10:37 by 杭伟, 72 阅读, 0 推荐, 收藏, 编辑
摘要:对象的创建过程: 1,申请内存,并初始化; 2,构造器初始化; 3,o指向对象。 对象在内存中的存储布局: 使用jol工具打印java对象在内存的存储布局: 其中,对象头的组成: 对象头包括Mark Word和Class Pointer MarkWord包含三个主要信息: 锁信息,GC,HashCo 阅读全文

锁的定义和实现、分类

2022-11-30 09:54 by 杭伟, 111 阅读, 0 推荐, 收藏, 编辑
摘要:什么是锁? 通过一种抽象的锁来对资源进行锁定。具体来说:操作修改一个数据,在同一时刻只允许一个线程操作,操作完毕才能轮到下一个线程。 在这个过程中,是什么阻止了另一个线程的操作?即是“锁”。 Java锁机制: (主要发生在堆和方法区等线程共享的数据区域) java中每个对象都有一把锁,锁记录在对象头 阅读全文

操作系统原理之线程的分类:用户级线程和内核级线程

2022-11-28 19:45 by 杭伟, 203 阅读, 0 推荐, 收藏, 编辑
摘要:本篇文章作为Java并发编程的前置重点知识,有助于理解乐观锁和悲观锁。 这个世界上只有两种锁--> 乐观锁:指的是在操作数据的时候非常乐观,乐观地认为别人不会同时修改数据,因此乐观锁默认是不会上锁的,只有在执行更新的时候才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作 阅读全文

HashMap实现原理和自动扩容

2022-11-28 17:42 by 杭伟, 90 阅读, 0 推荐, 收藏, 编辑
摘要:HashMap实现原理: JDK1.7:数组+单向链表(头插) 在并发情况下头插可能出现循环链表(死循环)问题。原因:因为头插,在新数组中链表的元素顺序发生了变化, 如上图,假设线程1在扩容,刚刚调整链表完毕;线程2的指针却指向的还是原来的元素。这时新数组链表中是1->2->3的指向,但是线程2却是 阅读全文

哈希,哈希表,哈希冲突和哈希函数

2022-11-25 12:00 by 杭伟, 80 阅读, 0 推荐, 收藏, 编辑
摘要:哈希是什么? 哈希不等于加密。哈希不可逆,一般的加密函数是可逆的。 哈希表: 数组使用下标(序号)和元素进行关系对应,通过数组下标可以直接找到内存地址; 哈希表使用哈希值和元素进行关系对应(key-value),对key进行哈希函数计算即可找到内存地址; 哈希冲突: 解决 1,封闭寻址(拉链) 2, 阅读全文