17.并发编程之wait notify

[TOC]一、原理分析Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片BLOCKED 线程会在 Owner 线程释放锁时唤醒WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入...

Java 2022-10-19 PM 536次 0条

16.并发编程之synchronized原理进阶(二)

[TOC]一、偏向锁概念轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS操作。Java 6中引入了偏向锁来做进一步优化:只有第一次使用CAS将线程ID设置到对象的Mark Word头,之后发现这个线程ID是自己的就表示没有竞争,不用重新CAS。以后只要不发生竞争,这个对象就归该线程所有。升级为轻量级锁的情况 (会进行偏向锁撤销) : 获取偏向锁的时候, 发现线程ID不是自...

Java 2022-10-18 PM 615次 0条

15.并发编程之synchronized原理进阶(一)

[TOC]一、轻量级锁轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以 使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是 synchronized示例假设有两个方法同步块,利用同一个对象加锁static final Object obj = new Object(); public static void method1() { ...

Java 2022-10-17 PM 855次 1条

14.并发编程之Monitor概念介绍

[TOC]一、Java对象头HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。HotSpot虚拟机的对象头包括三部分信息:Mark Word指向类的指针数组长度普通对象以 32 位虚拟机为例Klass Word:指向对象的类型(一个指针找到它的类对象)一个int 类型占4个字节,而一个I...

Java 2022-10-15 PM 843次 0条

13.并发编程之线程安全实例练习

[TOC]一、卖票问题练习总共有1000张票,通过循环的方式开启多个线程模拟多人买票场景/** * 卖票问题练习 */ @Slf4j(topic = "c.ExerciseSell") public class ExerciseSell { public static void main(String[] args) throws InterruptedExc...

Java 2022-10-13 PM 542次 0条

12.并发编程之线程安全实例分析

[TOC]前言分析线程是否安全,先对类的成员变量,类变量,局部变量进行考虑,如果变量会在各个线程之间共享,那么就得考虑线程安全问题了,如果变量A引用的是线程安全类的实例,并且只调用该线程安全类的一个方法,那么该变量A是线程安全的的。示例一Servlet运行在Tomcat环境下,只有一个实例,会被tomcat的多个线程共享,因此其中的成员变量都会存在共享问题。public class MySe...

Java 2022-10-12 PM 591次 0条

11.并发编程之变量的线程安全分析

[TOC]一、成员变量和静态变量是否线程安全?如果它们没有共享,则线程安全如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安全二、局部变量是否线程安全?局部变量是线程安全的但局部变量引用的对象则未必如果该对象没有逃离方法的作用范围,它是线程安全的如果该对象逃离方法的作用范围,需要考虑线程安全三、局部变量线程安...

Java 2022-10-11 PM 763次 0条

10.并发编程之线程八锁

[TOC]示例一程序运行结果为:1 2 或 2 1。@Slf4j(topic = "c.ThreadLockDemo01") public class ThreadLockDemo01 { public static void main(String[] args) { Number1 n1 = new Number1(); new...

Java 2022-10-10 PM 622次 0条

09.并发编程之共享问题

[TOC]一、共享带来的问题通过下方示例来演示共享变量产生的问题两个线程对初始值为0的静态变量一个做自增,一个做自减,各做5000次@Slf4j(topic = "c.Test01") public class Test01 { static int counter = 0; public static void main(String[] args) t...

Java 2022-10-10 PM 580次 0条

08.并发编程之线程状态

[TOC]一、五种状态五种状态的划分主要是从操作系统的层面进行划分的1. 新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随...

Java 2022-10-09 PM 618次 0条