![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线程
文章平均质量分 74
xiaopangcame
这个作者很懒,什么都没留下…
展开
-
Thread.join()
3.1 用法下源码里对这个方法的描述。// Thread.java/** * Waits for this thread to die. * * <p> An invocation of this method behaves in exactly the same * way as the invocation * * <blockquote> * {@linkplain #join(long) join}{@code (0)} * </bloc原创 2022-01-16 20:11:44 · 191 阅读 · 0 评论 -
JUC原子类: CAS, Unsafe和原子类详解
CAS线程安全的实现方法包含:互斥同步: synchronized 和 ReentrantLock 非阻塞同步: CAS, AtomicXXXX 无同步方案: 栈封闭,Thread Local,可重入代码什么是CASCAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些Ato..原创 2021-11-22 22:26:40 · 364 阅读 · 0 评论 -
线程池源码剖析
线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如,线程数一般取cpu数量+2比较合适,线程数过多会导致额外的线程切换开销。----摘自维基百科我们在Android或者Java开发中,...原创 2021-11-20 11:59:42 · 2170 阅读 · 0 评论 -
Java 并发编程(四):保证对象的线程安全性
02、线程安全类设计一个线程安全类需要三个步骤:1)找出表示对象状态的所有变量 2)对变量进行有效性约束 3)增加类的并发访问策略我在作者说的基础上做了微调,读起来更加容易理解。怎么和代码对应起来了,先来看一个普通的计数器类 Counter。public class Counter { private int value = 0; public int getValue() { return value; } public int i原创 2021-09-25 17:47:09 · 664 阅读 · 0 评论 -
Java 并发编程(三):保证共享变量的可见性
Java 内存模型(Java Memory Model,简称 JMM)描述了 Java 程序中各种变量(线程之间的共享变量)的访问规则,以及在 JVM 中将变量存储到内存→从内存中读取变量的底层细节。要知道,所有的变量都是存储在主内存中的,每个线程会有自己独立的工作内存,里面保存了该线程使用到的变量副本(主内存中变量的一个拷贝)。见下图。也就是说,线程 1 对共享变量 chenmo 的修改要想被线程 2 及时看到,必须要经过 2 个步骤:1、把工作内存 1 中更新过的共享变量刷新到主内存中。原创 2021-09-25 17:35:47 · 243 阅读 · 0 评论 -
Java并发编程(二):保证共享变量的原子性
怎么让一个类在多线程的环境下是安全的,有 3 条法则,让我来告诉你:1、不在线程之间共享状态变量。2、将状态变量改为不可变。3、访问状态变量时使用同步。那你可能要问,状态变量是什么?我们先来看一个没有状态变量的类吧,代码示例如下。class Chenmo { public void write() { System.out.println("我寻了半生的春天,你一笑便是了。"); }}Chenmo 这个类就是无状态变量的,它只有一个方法,既没有成员原创 2021-09-25 17:14:00 · 143 阅读 · 0 评论 -
Java 并发编程(一)
多线程带来的风险public class Unsafe { private int chenmo; public int add() { return chenmo++; }}上面这段代码在单线程的环境中可以正确执行,但在多线程的环境中则不能。递增运算chenmo++可以拆分为三个操作:读取 chenmo,将 chenmo 加 1,将计算结果赋值给 chenmo。两个线程可能交替执行,发生下图中的情况,于是两个线程就会返回相同的结果。这也是最常见的一种安全性问题。..原创 2021-09-25 11:51:30 · 93 阅读 · 0 评论 -
Java并发之CAS原理分析
CAS 底层原理CAS 的思想很简单:三个参数,一个当前内存值 V、旧的预期值 A、即将更新的值 B,当且仅当预期值 A 和内存值 V 相同时,将内存值修改为 B 并返回 true,否则什么都不做,并返回 false。上面那段话来源于官方解析我们拿 AtomicInteger 类来分析,先来看看 AtomicInteger 静态代码块片段:public class AtomicInteger extends Number implements java.io.Serializable {原创 2021-09-07 19:45:40 · 86 阅读 · 0 评论 -
Java并发的AQS原理详解
线程阻塞原语Java 的线程阻塞和唤醒是通过 Unsafe 类的 park 和 unpark 方法做到的。public class Unsafe { ... public native void park(boolean isAbsolute, long time); public native void unpark(Thread t); ...}复制代码这两个方法都是 native 方法,它们本身是由 C 语言来实现的核心功能。park 的意思是停车,让当前运行的线程原创 2021-09-06 23:16:21 · 549 阅读 · 1 评论 -
Java yieId()方法如何使用
yieId() 方法的作用是放弃当前的 CPU 资源,将它让给其他的任务去占用 CPU 执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得 CPU 时间片。例 1创建一个线程实现从 1 开始,共累加 5 千万次,要求在线程中输出开始运算时间、结束运算时间以及运算耗时时间。具体实现代码如下:package ch14;public class MyThread12 extends Thread{ @Override public void run() {原创 2021-08-07 11:18:10 · 79 阅读 · 0 评论 -
Java暂停/挂起线程(suspend())和恢复线程(resume())
暂停线程意味着此线程还可以恢复运行。在Java多线程中,可以使用 suspend() 方法暂停线程,使用 resume() 方法恢复线程的执行。suspend() 与 resume() 方法本节通过一个案例来介绍 suspend() 与 resume() 方法的用法。首先来看一下案例中使用到的 MyThread21 线程,代码如下所示。package ch14;public class MyThread21 extends Thread{ private long i=0; ..原创 2021-08-07 10:25:17 · 6071 阅读 · 0 评论