多线程
文章平均质量分 61
多线程总结
na_tion
601194865@qq.com
展开
-
多线程--04--线程状态--01--线程状态变化举例
java多线程状态变化举例原创 2022-11-02 17:40:41 · 233 阅读 · 0 评论 -
多线程--06--多线程安全问题解决--05--lock方式--02--原理
一、AQS数据结构AQS(AbstractQueuedSynchronizer 抽象队列同步器)数据结构如下:1、state 属性用来表示资源的状态(分独占模式和共享模式)。子类通过定义如何维护这个状态,从而控制如何获取锁和释放锁;2、提供了基于 FIFO 的等待队列,类似于 Monitor 的 EntryList3、条件变量来实现等待、唤醒机制,支持多个条件变量,类似于 Monitor 的 WaitSet图2 带condition的AQS图二、AQS的公平锁与非公平锁区别.原创 2022-03-28 23:02:30 · 887 阅读 · 0 评论 -
多线程--06--多线程安全问题解决--05--lock方式
一、lock接口规范void lock(); //加锁,同synchronizedvoid lockInterruptibly() //加锁,等待锁期间可被打断boolean tryLock(); //尝试获取锁,仅尝试一次boolean tryLock(long time, TimeUnit unit) //尝试获取锁,tim原创 2022-03-28 22:37:15 · 527 阅读 · 0 评论 -
多线程--02--01--线程池常见面试题
一、线程池参数(7-4-4)1、corePoolSize:线程池的基本大小,当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。说白了就是,即便是线程池里没有任何任务,也会有corePoolSize个线程在候着等任务。2、maximumPoolSize:最大线程数,不管你提交多少任务,线程池里最多工作线程数就是maximumPoolSize。3、keepAliveTime:线程的存活时间。原创 2022-03-27 23:37:38 · 3568 阅读 · 0 评论 -
多线程-07-算法面试题--02--手写交替输出
题目描述:有三个线程,交替输出A、B、C,各输出5次一、Synchronized实现(wait/notifyAll)package com.fuping3.printAsOrder;public class PrintCharWithSyn { private int stat=0; public void printChar(String str,int waitFlag,int nextFlag){ synchronized (this){原创 2021-09-22 16:19:40 · 332 阅读 · 0 评论 -
多线程-07-算法面试题--02--手写生产者消费者
设计一个有界阻塞队列:(1)多线程写入队列,当队列满时不能再写入数据;(2)单线程读取数据,当队列为空时不能读取数据;(3)读取超过一定时长则运行结束。一、Synchronized锁实现package com.fuping3.proandcon;import java.util.LinkedList;public class ListQueue{ private LinkedList<String> list=new LinkedList<String原创 2021-09-22 14:45:46 · 205 阅读 · 0 评论 -
多线程-07-算法面试题--01--手写单例
参考:设计模式--03--创建型--01--单例_na_tion的专栏-CSDN博客原创 2021-09-22 14:38:13 · 191 阅读 · 0 评论 -
多线程--06--多线程安全问题解决--03--无锁方式--原子类
一、乐观锁的定义乐观锁是无锁的实现。 乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。 乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。 乐观是相对于悲观锁而言。悲观锁,正如其名,具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度,为了避免同时被其他人修改,采取的是“先取锁再访问”的策略。synchronized、ReentrantLock都是悲观锁的典型例子。原创 2021-05-08 17:24:19 · 279 阅读 · 1 评论 -
多线程--06--多线程安全问题解决--02--不可变类方式
一、不可变类的设计不可变类是线程安全的,不可变类设计有3个特征:属性是final修饰的:保证了该属性在初始化后是只读的,不能修改。(happen-before-->final) 类是final修饰的:保证了类中的方法不会被重写,防止子类破坏不可变性。 保护性拷贝:保护性拷贝是指-->修改时新建一个对象,不使用原来的对象,保证了不共享变量。二、常见的不可变类String 包裹类,如Integer StringBuffer三、String的类的保护性拷贝举例(1)字符串截原创 2021-05-07 17:13:55 · 170 阅读 · 0 评论 -
多线程--06--多线程安全问题解决--01--总述--03--java如何保证原子性、有序性、可见性--02--原理--JMM(happen-before)、volatile和内存屏障
一、as-if-serial 原则(看似串行原则) 对开发者而言,当然希望不要有任何的重排序,这样理解起来最简单,指令执行顺序和代码顺序严格一致,写内存的顺序也严格地和代码顺序一致。但是,从编译器和CPU的角度来看,希望尽最大可能进行重排序,提升运行效率。于是,问题就来了,重排序的原则是什么?什么场景下可以重排序,什么场景下不能重排序呢?1.1 单线程程序的重排序规则 无论什么语言,站在编译器和CPU的角度来说,不管怎么重排序,单线程程序的执行结果不能改变...原创 2021-05-07 16:33:23 · 172 阅读 · 1 评论 -
多线程--06--多线程安全问题解决--01--总述--03--java如何保证原子性、有序性、可见性
一、JAVA如何保证原子性JMM只保证了基本读取和赋值是原子性操作(而且必须是将数字赋值给某个变量),变量之间的相互赋值不是原子操作 如果要实现更大范围操作的原子性,需要通过synchronized和Lock接口来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块,那么自然就不存在原子性问题了,从而保证了原子性。//举例:JMM只保证基本赋值的原子性x = 10; //原子操作y = x; //非原子操作x++;原创 2021-05-07 00:22:33 · 517 阅读 · 0 评论 -
多线程--06--多线程安全问题解决--01--总述--02--java中为什么会存在有序性、可见性问题
一、物理机的内存架构介绍(1)现代计算机的硬件内存架构如下图所示:多CPU:计算机在执行程序时,每条指令都是在CPU中执行的,一个现代计算机通常由两个或者多个CPU,其中一些CPU还有多核,这意味着,java多线程可以并行或并发的执行。 CPU寄存器:每个CPU都包含一系列的寄存器,它们是CPU内存的基础。CPU在寄存器上执行操作的速度远大于在主存上执行的速度。 高速缓存cache:主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快得多。每个CPU可原创 2021-05-06 23:55:41 · 260 阅读 · 2 评论 -
多线程--06--多线程安全问题解决--01--总述--01--如何解决、在解决什么?
一、多线程安全问题的解决为了避免多线程安全问题发生,有多种手段可以达到目的:(1)只读变量类变量、成员变量或局部变量只读不写(2)不共享变量局部变量--作用范围都放在方法内 (举例详见:多线程--04--变量线程安全分析--举例1); 类变量或成员变量--每次new (举例详见:多线程--04--变量线程安全分析--举例7)。(3)不可变类(4)阻塞式的解决方案(悲观锁):synchronized,Lock(5)非阻塞式的解决方案(乐观...原创 2021-05-04 15:21:11 · 219 阅读 · 2 评论 -
多线程--06--多线程安全问题解决--04--synchronized方式
一、多线程安全问题解决为了避免多线程安全问题发生,有多种手段可以达到目的:阻塞式的解决方案:synchronized,Lock 非阻塞式的解决方案:原子变量二、synchronized语法2.1 基本语法synchronized(对象) { ...}synchronized(俗称对象锁),它采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住。这样就能保证拥有锁的线程可以安全的执行临界区内的代码,不用担心线程上下原创 2021-04-25 18:03:10 · 172 阅读 · 0 评论 -
多线程--05--变量线程安全分析(重点)
一、先说结论1.1 成员变量和静态变量是否线程安全?1、如果它们没有共享,则线程安全。2、如果它们被共享了,根据它们的状态是否能够改变,又分两种情况: (1)如果只有读操作,则线程安全 (2) 如果有读写操作,需要考虑线程安全问题(读时可能会读到中间结果,所以有读写时,读也要考虑线程安全)1.2 局部变量是否线程安全?1、基本数据类型的局部变量是线程安全的。2、引用类型的局部变量,要看该对象有没有逃离方法的作用范围, ...原创 2021-04-25 16:23:48 · 1066 阅读 · 0 评论 -
多线程--04--线程状态(生命周期)
一、从操作系统层面看线程状态--5种状态【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行【运行状态】指获取了 CPU 时间片运行中的状态 当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换【阻塞状态】------(阻塞状态不会用到CPU) 1、如果调用了阻塞 API,如 BIO...原创 2021-04-24 21:44:47 · 424 阅读 · 0 评论 -
多线程--03--线程常用API
一、常用API方法名 功能说明 注意 start() 启动一个新线程,在新的线程运行 run 方法中的代码 start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次,会出现IllegalThreadStateException run() 新线程启动后会调用的方法 yield() 提示线程调度器让出当前线程对CPU的使用,让出后可能该线程又继续被调...原创 2021-04-24 21:10:19 · 712 阅读 · 0 评论 -
多线程--02--线程四种创建方式
package com.fuping3.basic;/** * 实现多线程方式一 * 优点:编写简单,可直接用this.getname()获取当前线程,不必使用Thread.currentThread()方法。 * 缺点: * 1、使用继承方式,MyThread不能再继承其他类 * 2、无返回值 */public class MyThread extends Thread{ @Override public void run() { whi.原创 2021-04-23 19:45:37 · 141 阅读 · 0 评论 -
多线程--01--基本概念
一、基本概念介绍1.1 多线程作用 为了更好的利用cpu的资源,以期望提高程序执行效率。IO 操作不占用 cpu,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。所以才有后面的【非阻塞 IO】和【异步 IO】优化1.2 并行与并发并发:一个核快速切换多个线程,让它们依次执行,看起来像并行,实际上是并发。并行:同一时间多个线程同时执行。【系统要有多个CPU才会出现并行】并行在多处理器系统中存在,而并...原创 2021-04-23 19:39:45 · 128 阅读 · 0 评论