Java多线程速记

内存:所有的变量都存储在主内存,但每条线程有工作内存,线程间传递内存需要主内存帮忙

线程实现:1.使用内核线程实现-使用内核线程的高级接口—轻量级进程(即线程),创建、析构、同步都需要进行系统调用。2.使用用户线程实现-阻塞,多处理器等问题无法处理3.用户线程+轻量级进程混合实现。Win和linux 一对一的线程模型实现的,一条Java线程就映射到一条轻量级进程之中

Thread.yield()可以暂停线程(抢占式调度和协同式线程调度)

状态:新建、开始、期限等待、阻塞、结束

线程安全的实现方法:1.互斥同步(悲观monitorentermonitorexit。2.非阻塞同步(乐观)如AtomicInteger。(有ABA问题)3.无同步方案:无共享内存  Collections.synchronizedMap,ConcurrentHashMap

线程安全:不可变,绝对/相对线程安全,线程兼容,线程对立。

Volatile:最轻量级的同步机制,保证变量对所有线程可见(新值立刻同步,每次使用从主存刷新),保证了变量自身的原子性,禁止了指令重排序优化(单线程重排序仍有序,多线程爆炸)。

Synchronized:重量级操作,因为阻塞,唤醒需要从用户态到核心态

ReentrantLock:等待中断、公平锁、锁定可以帮定多个。1.6性能平

锁优化:1.自旋锁(等10再进入内核态)2.锁消除(编译时完成,逃逸分析,StringBuffer+)3.锁粗化(同对象只上一次)4.轻量级锁(无锁先加“锁记录”空间,copy 头到空间,指针指向,成功就好00,不成且不是自己的锁就膨胀成自旋锁)5偏向锁: 标识是否设置成1,测试线程ID是否能指向当前线程,可以膨胀成轻量级锁。          对象头:1.Mark Word(存储对象哈希码、GC标识、年龄、同步锁等)2.Klass Point(指向存储类型元数据的指针)3.用于字节对齐补白的填充数据(8字节不补)

你可能感兴趣的:(java)