JUC (java并发编程学习分享篇)

简介: JUC (java并发编程学习分享篇)

JUC

1.进程线程  同步异步 并发并行
线程创建的三种方式
linux查看进程中的线程命令
top -H -p PID(进程id)
java jps命令
jstack  PID (详细快照)
远程使用jconsole连接服务
java -Djava.rmi.server.hostname=172.19.71.34
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=端口号
-Dcom.sun.management.jmxremote.ssl=fasle(是否安全链接)
-Dcom.sun.management.jmxremote.authenticate=false(是否认证)类名

栈与栈帧
Java 线程6种状态


并发临界区
synchronized使用对象锁保证了临界区代码的原子性

Synchornized 在普通方法上锁的this对象
Synchornized 在静态方法上锁的class对象

private 和final 保证线程安全 开闭原则

多个线程调用同一个实例是线程安全的,每一个方法的操作是线程安全的,但是方法的组合不是线程安全的
超买超卖问题,转账问题 对synchronized(this/Class.class)
2.monitor



偏向锁  JDK6
第一次CAS获取到锁monitor时,将线程threadID 记录到markword头, 之后比较线程ID来进行是否需要CAS。
JOL 查看对象的偏向锁标记 MarkWord 头 001


启动开启偏向锁命令参数
-XX:BiasedLockingStartupDelay=0


禁用偏向锁
-XX:-UseBiasedLocking


存在锁竞争 时锁膨胀升级



启用偏向锁
-XX:+UseBiasedLocking
调用hashcode 会使对象从偏向为普通状态
为什么轻量级和重量级调hashcode()不会变为普通状态?
因为轻量级锁 hashcode存放在栈帧lockRecord中 重量级锁的hashcode在monitor中


wait notify


批量锁偏向  jvm 阈值20次  撤销偏向超过20次 不会升级到轻量级锁 而是取消偏向之前的线程,重新偏向与另一个线程。
jvm 阈值40次  撤销偏向超过40次之后,对象不偏向于任何线程。
锁消除
jvm 默认开启   JIT对没有竞争的代码进行消除 synchronized
轻量级锁  
栈帧LockRecord 对象
CAS成功 替换markword 00
锁重入  CAS LockRecord 计数+1 尝试替换Markword 每次都会CAS
CAS 失败原因 线程竞争激烈 ,流程 thread-01把Object的monitor升级为重量级锁 并进入monitor的阻塞list中
CAS失败 锁膨胀 通过monitor找到地址并把owner置位null 唤醒阻塞list


重量级锁
自旋优化    JDK7以后由JVM控制

Sleep 、Wait
Thread 和Object
Sleep不会
锁  Wait会释放锁 进入WaitSet
wait+synchronized
thread state  time_wait
JDK Thread Join( )  保护性暂停模式


死锁




volatile 保证可见性和有序性 保证不了原子性

目录
相关文章
|
27天前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
34 10
|
30天前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
85 4
|
30天前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
30 4
|
30天前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
52 1
|
2月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
2月前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
233 2
|
2月前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
87 12
|
2月前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
2月前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
73 3
|
2月前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
50 0

热门文章

最新文章