并发编程
文章平均质量分 94
o六耳猕猴桃o
这个作者很懒,什么都没留下…
展开
-
Java并发编程学习(10):线程池、饥饿现象
自定义线程池class ThreadPoolTest{ public static void main(String[] args){ RejectPolicy<Runnable> rejectPolicy = BlockingQueue::put; MyThreadPool pool = new MyThreadPool(3, 1000, TimeUnit.MILLISECONDS, 4, rejectPolicy); for (int原创 2021-07-06 10:57:41 · 474 阅读 · 0 评论 -
Java并发编程学习(9):不可变对象、final原理
以String类为例在java中,String是我们平时用到的最常见的不可变类之一,这里我们以String类为例,看看不可变类的设计。在String类的开头部分如下,我们可以看到String类被final修饰,同时其成员变量value也被final修饰。public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is u原创 2021-07-01 15:42:10 · 160 阅读 · 0 评论 -
Java并发编程学习(8):CAS机制、原子变量
示例引入我们需要执行一个高并发削减账户余额的逻辑。为方便起见,我们将账户类设计为一个抽象类,并且只对中的静态demo()方法进行了实现。在demo()方法中,我们会生成若干线程,每个线程执行同样的逻辑:扣除账户中的余额。当全部线程执行完毕后,方法会打印账户的余额数量以及执行程序的用时。abstract class Account{ abstract String getName(); abstract int getBalance(); abstract void wi原创 2021-06-11 20:07:44 · 240 阅读 · 0 评论 -
Java并发编程学习(7):线程安全与反序列化安全的单例模式
单例模式单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。特点单例模式有 3 个特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点。优缺点单例模式的优点:单例模式可以保证内存里只有一个实例,减少了内存的开销。可以避免对资源的多重占用。单例模式原创 2021-06-03 12:01:24 · 256 阅读 · 1 评论 -
Java并发编程学习(6):可见性、有序性
Java内存模型概念Java内存模型(Java Memory Model, JMM),它定义了主存、工作内存的抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。体现原子性:保证指令不会受到线程上下文切换的影响可见性:保证指令不会受到CPU缓存的影响有序性:保证指令不会受到CPU并行优化的影响原子性Monitor主要关注的是访问共享变量时,保证了临界区代码的原子性可见性现象:不会停下来的循环在下面的代码中,变量run初始值为true,1秒后,主线程将其修改为fals原创 2021-06-02 16:10:29 · 106 阅读 · 0 评论 -
Java并发编程学习(5):死锁、可重入锁、控制线程顺序
死锁要点一个线程需要同时获取多把锁,这是就容易发生死锁,例如:t1线程获得A对象的锁,接下来想获得B对象的锁t2线程获得B对象的锁,接下来想获得A对象的锁代码示例public class DeathLockDemo { public static void main(String[] args) { Object a = new Object(); Object b = new Object(); Runnable task1= ()原创 2021-05-28 15:55:51 · 165 阅读 · 0 评论 -
Java并发编程学习(4):生产者消费者、线程状态转换
生产者-消费者模型要点生产者仅负责产生数据结果,不关心数据如何处理消费者专心处理数据结果消息队列可以用来平衡生产者与消费者的线程资源消息队列有容量限制,满时不会再加入数据JDK中各种阻塞队列,采用的就是这种模式代码示例消息队列消息队列是模型中核心组成部分,控制着入队和出队逻辑。消息队列存在容量上线,当消息队列满时,如果有线程希望继续向队列中添加消息,则会进入等待状态;同理,当消息队列为空时,如果有线程希望继续从队列中取出消息,也会进入等待状态。因此,再完成向消息队列中存入/取出消原创 2021-05-27 09:51:36 · 87 阅读 · 0 评论 -
Java并发编程学习(3):Monitor、wait-notify与保护性暂停
JVM中的MonitorJava 对象头在Hotspot中一个Java对象包含如下三个部分:对象头实例信息对齐信息vm对象头信息是与对象自身定义的数据无关的额外存储的信息,由于它存在于对象中,jvm规范中安装对象类型,分两种类型:普通对象包含:Mark Word、Klass Pointer(元数据指针)数组对象包含:Mark Word、Klass Pointer(元数据指针)、Array Length在不同JVM下,对象头每一部分占用的内存并不相同数据含义32位JVM原创 2021-05-18 17:34:38 · 194 阅读 · 0 评论 -
Java并发编程学习(2):synchronized的使用与线程安全类
问题引入在下面的代码中,两个线程操作了同一个变量count,其中一个线程执行自增,另一个线程执行自减,且各自均执行5000次。直观感受上,变量count的最终结果应该为0,但事实并非如此。static Integer count = 0;public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i &原创 2021-05-14 21:03:59 · 83 阅读 · 0 评论 -
Java并发编程学习(1):线程的创建、启动、常用方法与线程的状态
概念进程与线程进程程序由指令和数据组成,当一个程序被运行,从磁盘加载这个程序的的代码到内存,这是就开启了一个进程进程可以视为程序的一个实例线程一个进程之类可以分为一个或多个线程一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行两者对比Java中,线程作为最小的调度单位,进程作为资源分配的最小单位在Windows中进程是不活动的,只是作为线程的容器进程基本上相互独立,而线程存在于进程内,是进程的一个子集进程拥有共享的资源,如内存空间,供其内部的线程共享原创 2021-05-12 17:12:04 · 160 阅读 · 0 评论