线程、并发
文章平均质量分 82
新启线程、线程池,多线程相关知识点
炎升
这个作者很懒,什么都没留下…
展开
-
Java的4种引用类型
java为引用类型专门定义了一个类叫做。Reference是跟java垃圾回收机制息息相关的类,通过探讨Reference的实现可以更加深入的理解java的垃圾回收是怎么工作的。引用的结构图如下:引用队列是为了配合SoftReference、WeakReference、PhantomReference使用,它们三个在GC回收之前会被放到引用队列里ReferenceQueue保存下。原创 2022-08-23 10:08:13 · 2486 阅读 · 0 评论 -
并发编程学习(十四):tomcat线程池
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。ConnectorContainer由 Engine、Host、Context和Wrapper 四个容器组成ServiceConnector 和 Container 两个核心组件。原创 2023-05-31 14:27:38 · 2173 阅读 · 0 评论 -
并发编程学习(十二):字段更新器、原子累加器
字段更新器,主要是用来更新自定义类的字段。注意的是:字段更新器要操作(原子操作)哪个字段,哪个字段必须被 volatile 修饰,否则会出现异常。运行结果:102020。原创 2023-05-12 09:17:13 · 505 阅读 · 1 评论 -
并发编程学习(十):共享模式无锁、原子整数、原子引用类型
获取共享变量时,为了保证该变量的可见性,需要使用volatile修饰。它可以用来修饰成员变量和静态成员变量,它可以避免线程从自己的工作缓存中查找变量,必须到主存中获取它的值,线程操作volatile变量都是直接操作主存,即一个线程对volatile变量的修改,对另一个线程可见。注意:volatile仅仅保证了共享变量的可见性,让其它线程能够开到新值,但不能解决指令交错问题(不能保证原子性)。CAS必须借助volatile才能读取到共享变量的最新值来实现【比较和交换】的效果。原创 2023-05-11 15:45:11 · 539 阅读 · 0 评论 -
并发编程学习(十一):原子数组、
方法名说明创建给定长度的新创建与给定数组具有相同长度的新,并从给定数组复制其所有元素方法名说明创建与给定数组具有相同长度的新,并从给定数组复制其所有元素。这个构造方法传入一个数组对象时,该数组对象必须是引用类型,int[]不可以,但是Integer[]的可以创建给定长度的新 AtomicReferenceArray。为数组的每一位设置什么值是没有要求的,类似于Map的形式。原创 2023-05-11 17:20:34 · 669 阅读 · 0 评论 -
并发编程学习(九):同步模式之顺序控制、交替打印
同步模式之顺序控制、交替打印原创 2023-01-31 11:03:09 · 603 阅读 · 0 评论 -
并发编程学习(八):ReentrantLock特性、哲学家吃饭问题
ReentrantLock 是java.util.concurrent.locks包下的类。相对于synchronized,它具备如下特性:可中断。可以设置超时时间。可以设置公平锁。支持多个条件变量。即可以有个多个waitset等待队列。与synchronized都支持可重入。可冲入是指 同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁。如果是不可冲入锁,那么第二次获取锁时,自己会被锁挡住。原创 2023-01-30 14:41:25 · 877 阅读 · 1 评论 -
并发编程学习(七):线程活跃性:死锁、活锁、饥饿
即可定位到死锁的类和行数。原创 2023-01-28 14:58:04 · 874 阅读 · 0 评论 -
并发编程学习(六):park、unpark
它们是LockSupport类中的方法,内部调用的是Unsafe类中的native方法。RUNNINGLockSupport.unpark(要恢复的线程对象);先park再unpark的方式是容易理解的。但还有一个场景,先unpark后再次执行park方法,也不会阻塞调用了park方法的线程。理解为park方法就是校验获取一个通行令牌,而unpark方法是获取到一个通行令牌的过程。先执行unpark方法,代表先获得了通行令牌。原创 2022-12-23 17:57:19 · 1716 阅读 · 0 评论 -
并发编程学习(五):设计模式~同步模式之保护性暂停
保护性暂停 即Guarded Suspension,用于在一个线程等待另一个线程的执行结果。要点:有一个结果需要从一个线程传递到另一个线程,让它们关联同一个对象GuardedObject。如果有结果不断从一个线程到另一个线程,那么可以使用消息队列。JDK中,join的实现、Future的实现,采用的就是此模式。原创 2022-12-22 15:57:48 · 1021 阅读 · 0 评论 -
并发编程学习(四):wait()、nitify()
线程通信:wait() / notify() / notifyAll() 此三个方法定义在Object类中的。obj.wait() 让进入object监视器的线程 到waitset等待。obj.notify()在object上正在waitSet等待的线程挑一个唤醒。obj.notifyAll()让object上正在waitSet等待的线程全部唤醒。它们都是线程之间进行协作的手段,都属于Object对象的方法。必须获得此对象obj的锁,才能调用这几个方法。wait() 方法会释放对象的锁。原创 2022-12-22 14:57:09 · 951 阅读 · 0 评论 -
JOL(java object layout): java 对象内存布局
JOL的全称是Java Object Layout 即 java 对象内存布局。是一个用来分析JVM中Object布局的小工具。包括Object在内存中的占用情况,实例对象的引用情况等等。JOL可以在代码中使用,也可以独立的以命令行中运行。命令行的我这里就不具体介绍了,今天主要讲解怎么在代码中使用JOL。.....................转载 2022-08-10 15:25:52 · 2669 阅读 · 0 评论 -
什么是CAS
CAS : compare and swap 比较和交换。: 中间 改过值,但最终又回到0 了。例如:原值:0线程1:读取 0, 要将0 改为 1。但没改之前,发现以下操作,所以线程1在将0改为1时,这个0已经不是之前的0 了。线程2: 读取 0,将值改为 2。线程3: 读取2,将值改为 0。ABA问题 的简单理解:你的女朋友在离开你的这段儿时间经历了别的人,自旋就是你空转等待,一直等到她接纳你为止。:加版本号。基础类型简单值不需要版本号。......原创 2022-08-10 16:32:16 · 89 阅读 · 0 评论 -
java内存模型、volatile关键字、synchronized
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。原创 2022-08-20 14:20:41 · 1022 阅读 · 0 评论 -
高并发学习-20220816-锁升级
前提:使用synchronized给object对象加锁。1、刚new出的 object对象,是没有上锁的。-- 无锁2、如果同一时刻只有一个线程在使用object对象 这把锁,则将从 无锁-升级为-偏向锁。object对象头markwod中会写入当前线程指针。3、只要发生锁竞争,及同一个时刻还有其他线程在竞争这把锁,则 将从 偏向锁-升级为-轻量级锁(也叫自旋锁)。升级过程为:①撤销偏向锁。......原创 2022-08-18 10:52:32 · 269 阅读 · 0 评论 -
java锁升级
我们简称为。原创 2022-08-17 17:30:26 · 3832 阅读 · 0 评论 -
并发编程学习(三):主线程、守护线程
2、tomcat中的acceptor和poller线程都是守护线程,所以tomcat接收到shutdown命令后,不会等待它们处理完当前请求。调用Thread的 isDaemon() ,可以返回该线程是否为守护线程。返回true-守护线程。调用Thread的 setDaemon(true) ,代表设置该线程为守护线程。,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。默认情况下,java进程需要等待所有线程都运行结束,才会结束。1、 垃圾回收器线程就是一种守护线程。原创 2022-12-19 11:33:26 · 80 阅读 · 0 评论 -
并发编程学习(二):两阶段终止模式(two phase termination)
在一个线程t1中如何优雅的终止线程t2?这里的优雅指的是给t2一个料理后事的机会。该行为是为了防止while(true) 占用大量的内存资源,通过睡眠2s可以大幅度减少内存消耗。,会抛出异常,并清除打断标记,所以需要线程内部自己重新设置打断标记。原创 2022-12-13 15:48:05 · 99 阅读 · 0 评论 -
并发编程学习(一):Thread类中的常用的方法
1.启动当前线程;调用当前线程的run()。start方法只是让线程进入就绪,里面的代码不一定立刻运行(CPU的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用多次会出现IllegalThreadStateException.2. run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中.3. currentThread():静态方法,返回执行当前代码的线程4. getName():获取当前线程的名字。原创 2022-12-13 15:10:08 · 681 阅读 · 0 评论 -
线程安全与线程不安全
1、线程安全:指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行程序时出现意外结果。2、线程不安全:是指不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。扩展资料1、引起线程安全问题的原因:线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程.原创 2021-05-28 15:21:58 · 8255 阅读 · 0 评论 -
Java中锁种类、实现方式
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现。如 synchronized 和 ReentrantLock(并发包中的锁类)等 。1、锁涉及的几个重要概念死锁线程之间相互等着对方释放资源,而自己的资源又不释放给别人,这种情况就是死锁。所以,只要其中一线程释放了资源,死锁就会被解除。重入锁重入锁指的是,一个线程在拥有了当前资源的锁之后,可以再次拿到该锁而不被阻塞。在后面会讲到synchronized的重入锁原理。自旋锁自旋锁指的是,线程在没有获得锁时,不是被直接挂起,而原创 2021-03-08 16:00:32 · 4355 阅读 · 0 评论 -
线程的几种状态
1、java中线程的6种状态:1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。3.阻塞(BLOCKE...原创 2021-03-08 10:39:06 · 1327 阅读 · 0 评论 -
java线程状态5种与6种说明
线程状态:java线程层面:有6种状态; 操作系统层面: 5种状态。一、java线程层面线程状态:1、线程状态说明java线程有6种状态,源码如下:public class Thread implements Runnable { public enum State { /** * Thread state for a thread which has not yet started. * * 当线程被创原创 2021-02-24 22:45:01 · 1346 阅读 · 0 评论 -
线程池参数
1、为什么使用线程池(线程池好处)?线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果提交的任务超过了线程能执行的最大数量,超出的数量的任务会被提交到一个阻塞队列排队等候,等其他线程执行完毕,再从队列中取出任务来执行.主要特点为:线程复用、控制最大并发数、管理线程. 降低资源消耗。通过重复利用已经创建的线程,降低线程创建的和销毁造成的消耗。例如,工作线程Woker会无线循环获取阻塞队列中的任务来执行。 提高响应速度。当任务到达时,任..原创 2021-01-12 13:37:39 · 106 阅读 · 0 评论 -
创建线程的几种方式
新启线程的方式:方式一、扩展自Thread类 private static class UseThread extends Thread{ @Override public void run() { super.run(); // do my work; System.out.println("I am extends Thread"); } }方式二、实现Runnable接口 p...原创 2020-07-17 10:47:09 · 916 阅读 · 0 评论