![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 96
java多线程
喝水的鱼.
这个作者很懒,什么都没留下…
展开
-
多线程概述
FutureTask是Future接口的唯一的实现类RunnableFuture同时实现了Runnable接口与Future接口,FutureTask实现了RunnableFuture接口,且构造方法接收Callable入参,所以它既可以作为Runnable被线程执行,又可以作为Futrue得到Callable的返回值。/***/Thread t1 = new Thread(futureTask , "继承Callable线程");原创 2024-03-13 10:47:46 · 1013 阅读 · 1 评论 -
多线程锁.
偏向锁:适用于单线程适用的情况,在不存在锁竞争的时候进入同步方法/代码块则使用偏向锁。轻量级锁:适用于竞争较不激烈的情况(这和乐观锁的使用范围类似), 存在竞争时升级为轻量级锁,轻量级锁采用的是自旋锁,如果同步方法/代码块执行时间很短的话,采用轻量级锁虽然会占用cpu资源但是相对比使用重量级锁还是更高效。重量级锁:适用于竞争激烈的情况,如果同步方法/代码块执行时间很长,那么使用轻量级锁自旋带来的性能消耗就比使用重量级锁更严重,这时候就需要升级为重量级锁。原创 2024-03-13 17:11:15 · 1040 阅读 · 0 评论 -
volatile 关键字解析
摘要:在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性、可见性和有序性。只要有一条原则没有被保证,就有可能会导致程序运行不正确。volatile关键字被用来保证可见性,即保证共享变量的内存可见性以解决缓存一致性问题。一旦一个共享变量被 volatile关键字 修饰,那么就具备了两层语义:内存可见性和禁止进行指令重排序。转载 2024-03-14 15:57:24 · 604 阅读 · 0 评论 -
Synchronized
输出结果总结一个对象里面如果有多个非静态synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了, 其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一的一个线程去访问这些synchronized方法 锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法。当一个线程正在访问一个对象的非静态 synchronized 方法,那么其他线程不能访问该对象的其他 非静态synchronized 方法。原创 2024-03-12 16:57:39 · 829 阅读 · 1 评论 -
Synchronized 锁升级优化
JVM 在 JDK1.6 中引入了分级锁机制来优化 Synchronized,当一个线程获取锁时,首先对象锁将成为一个偏向锁,这样做是为了优化同一线程重复获取导致的用户态与内核态的切换问题;其次如果有多个线程竞争锁资源,锁将会升级为轻量级锁,它适用于在短时间内持有锁,且分锁有交替切换的场景;偏向锁还使用了自旋锁来避免线程用户态与内核态的频繁切换,大大地提高了系统性能;但如果锁竞争太激烈了,那么同步锁将会升级为重量级锁。减少锁竞争,是优化 Synchronized 同步锁的关键。原创 2024-03-12 17:13:05 · 1053 阅读 · 1 评论 -
线程工具类与原子类
CountDownLatch 一般用于某个线程 A 等待若干个其他线程执行完任务之后,它才执行;CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;CountDownLatch是不能够重用的,而 CyclicBarrier 是可以重用的(reset)。Semaphore和锁有点类似,它一般用于控制对某组资源的访问权限。原创 2024-03-14 09:38:04 · 870 阅读 · 0 评论 -
ThreadLocal 的原理及问题
ThreadLocal 是线程内部的数据存储类,每个线程中都会保存一个ThreadLocal.ThreadLocalMap threadLocals = null;,ThreadLocalMap 是 ThreadLocal 的静态内部类,里面保存了一个 private Entry[] table 数组,这个数组就是用来保存 ThreadLocal 中的值。通过这种方式,就能让我们在多个线程中互不干扰地存储和修改数据。转载 2024-03-12 17:15:42 · 60 阅读 · 1 评论 -
Java进程CPU高负载排查
CPU飙升问题定位的一般步骤是:1.首先通过top指令查看当前占用CPU较高的进程PID;2.查看当前进程消耗资源的线程PID: top -Hp PID3.通过print命令将线程PID转为16进制,根据该16进制值去打印的堆栈日志内查询,查看该线程所驻留的方法位置。4.通过jstack命令,查看栈信息,定位到线程对应的具体代码。5.分析代码解决问题。原创 2024-03-12 17:27:41 · 1820 阅读 · 1 评论