线程
文章平均质量分 71
lhj_loveFang_1105
稳住不慌
展开
-
Java并发扩充
实现接口 VS 继承 Thread实现接口会更好一些,因为:Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口;类可能只要求可执行就行,继承整个 Thread 类开销过大。Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock。Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一..原创 2021-04-03 13:30:26 · 117 阅读 · 0 评论 -
线程池再理解
线程池参数corePoolSize:线程池的核心线程数量maximumPoolSize:线程池的最大线程数keepAliveTime:当线程数大于核心线程数时,多余的空闲线程存活的最长时间unit:时间单位workQueue:任务队列,用来储存等待执行任务的队列threadFactory:线程工厂,用来创建线程,一般默认即可-handler:拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务线程池工作原理在创建完线程池之后,默认情况下,线程池中并没有任何线程,等到原创 2021-03-26 12:58:07 · 113 阅读 · 0 评论 -
ThreadLocal原理探究和内存泄漏问题
什么是ThreadLocalThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离。应用场景管理Connection在学JDBC的时候,为了方便操作写了一个简单数据库连接池,需要数据库连接池的理由也很简单,频繁创建和关闭Connection是一件非常耗费资源的操作,因此需要创建数据库连接池。那么,数据库连接池的连接怎么管理呢??我们交由ThreadLocal来进行管理。为什么交给它来管原创 2021-03-20 16:51:30 · 133 阅读 · 0 评论 -
Volatile再理解~
概述都知道他是实现共享变量在多线程之间的可见性,那么有没有想过是什么导致了这种不可见?变量在多个CPU之间共享(处理器角度实现可见性)现代计算机内存模型。其实早期计算机中cpu和内存的速度是差不多的,但在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再原创 2021-03-20 15:02:03 · 129 阅读 · 0 评论 -
Java并发编程的艺术思维导图
原创 2021-02-26 19:46:38 · 138 阅读 · 0 评论 -
Java多线程编程核心技术思维导图
原创 2021-02-26 19:38:58 · 194 阅读 · 0 评论 -
线程池和Executor框架
前言Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可原创 2021-02-24 17:04:13 · 96 阅读 · 0 评论 -
Java中的并发工具类
等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。计数原创 2021-02-23 15:29:13 · 91 阅读 · 0 评论 -
Java并发容器
ConcurrentHashMapConcurrentHashMap是线程安全且高效的HashMap。在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap的登场机会。线程不安全的HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。HashMap在并发执行put操作时会引起死循环,是因为多线程原创 2021-02-23 09:53:19 · 89 阅读 · 1 评论 -
Java中的锁
概述在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。队列同步器队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。ReentrantLock、Re原创 2021-02-22 18:39:41 · 119 阅读 · 0 评论 -
Java并发机制底层实现原理
上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。当并发执行累加操作不超过百万次时,原创 2021-02-17 20:29:45 · 126 阅读 · 0 评论 -
线程的状态
线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中线程状态有如上6种。NEW状态是线程实例化后还从未执行start()方法时的状态RUNNABLE状态是线程进入运行的状态TERMINATED是线程被销毁时的状态。TIMED_WAITING代表线程执行了Thread.sleep()方法,呈等待状态,等待时间到达,继续向下运行。BLOCKED状态出现在某一个线程在等待锁的时候。WAITING是线程执行了Object.wait(方法后所处的状态。...原创 2021-02-14 19:44:41 · 129 阅读 · 0 评论 -
单例模式与多线程
饿汉模式实现单例模式懒汉模式实现单例模式缺点懒汉模式在多线程环境下不能保持单例状态。解决声明synchronized关键字既然多个线程可以同时进入getInstance()方法,那么只需要对getInstance()方法声明synchronized关键字即可。此方法加入同步synchronized关键字得到相同实例的对象,但此种方法的运行效率非常低下,是同步运行的,下一个线程想要取得对象,则必须等上一个线程释放锁之后,才可以继续执行。同步代码块本质与上一个方法一致,效率低。原创 2021-02-14 19:38:43 · 84 阅读 · 0 评论 -
定时器Timer
定时器使用Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类执行计划任务的代码要放入TimerTask的子类中,因为TimerTask是一个抽象类。schedule (TimerTask task,Date time)该方法的作用是在指定的日期执行一次某一任务。查看构造方法可以得知,创建一个Timer就是启动一个新的线程,这个新启动的线程并不是守护线程,它一直在运行。这样程序运行后迅速结束当前进程。TimerTask是以队列的方式一个一个被顺序执行的,所以执行原创 2021-02-14 19:16:48 · 415 阅读 · 0 评论 -
Lock的使用
使用ReentrantLock 类在Java多线程中,可以使用synchronized关键字来实现线程之间同步互斥,但在JDK1.5中新增加了ReentrantLock类也能达到同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定、多路分支通知等功能,而且在使用上也比 synchronized更加的灵活。调用ReentrantLock对象的lock()方法获取锁,调用unlock()方法释放锁。调用lock.lock()代码的线程就持有了“对象监视器”,其他线程只有等待锁被释放时再次争抢。效果和原创 2021-02-09 19:41:53 · 369 阅读 · 0 评论 -
线程间通信
等待/通知机制线程与线程之间不是独立的个体,它们彼此之间可以互相通信和协作。厨师和服务员之间的交互要在“菜品传递台”上,在这期间会有几个问题:1)厨师做完一道菜的时间不确定,所以厨师将菜品放到“菜品传递台”上的时间也不确定。2)服务员取到菜的时间取决于厨师,所以服务员就有“等待”( wait)的状态。3)服务员如何能取到菜呢?这又得取决于厨师,厨师将菜放在“菜品传递台”上,其实就相当于一种通知(notify),这时服务员才可以拿到菜并交给就餐者。4)在这个过程中出现了“等待/通知”机制。实现原创 2021-02-08 19:36:18 · 111 阅读 · 0 评论 -
对象及变量的并发访问
方法内的变量为线程安全“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了。实例变量非线程安全如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。这时需要加synchronized关键字进行上锁实现同步。关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只原创 2021-02-06 19:53:21 · 144 阅读 · 0 评论 -
Java多线程技能
进程和多线程的概念及线程的优点通过查看“Windows任务管理器”中的列表,完全可以将运行在内存中的exe文件理解成进程,进程是受操作系统管理的基本运行单元。那什么是线程呢?线程可以理解成是在进程中独立运行的子任务。比如,QQ.exe运行时就有很多的子任务在同时运行。再如,好友视频线程、下载文件线程、传输数据线程、发送表情线程等,这些不同的任务或者说功能都可以同时运行,其中每一项任务完全可以理解成是“线程”在工作,传文件、听音乐、发送图片表情等功能都有对应的线程在后台默默地运行。这样做有什么优点呢原创 2021-02-05 17:25:47 · 171 阅读 · 0 评论 -
关于volatile关键字
作用关键字volatile的主要作用是使变量在多个线程间可见举个例子:class RunThread extends Thread { private boolean isRunning = true; public boolean isRunning() { return isRunning; } public void setRunning(boolean running) { isRunning = running; }原创 2020-11-07 16:55:21 · 149 阅读 · 0 评论 -
多线程进阶学习
将围绕下面开始学习:1.各种锁策略.2.CAS机制.3. synchronized原理和优化机制.4. java.util.concurrent (简称juc)包中的重要组件5. ConcurrentHashMap1.锁策略广泛,宏观的不仅仅局限于Java . 各种需要设计锁的场景都可能会涉及到~以下介绍的锁策略,都是面试中比较常见的:1)乐观锁vs悲观锁乐观锁:世界大概率是和平的,多个线程竞争一把锁的概率会很低. [效率更高]悲观锁:世界大概率是出问题的,多个线程竞争一把锁的概率会很高原创 2020-08-11 15:57:47 · 139 阅读 · 0 评论 -
线程池
线程池的核心操作:1.execute:把一个任务加入到线程池中2.shutdown:销毁线程池中的所有线程线程池组成部分:1.现有一个类,表示工作线程2.还得有一个类,来描述具体线程要做的工作是啥3.需要有一个数据结构来组织若干任务4.还需要一个数据结构来组织若干线程import java.util.ArrayList;import java.util.List;import java.util.concurrent.BlockingQueue;import java.util.con原创 2020-06-15 14:28:15 · 105 阅读 · 0 评论 -
单例模式,阻塞队列,定时器
单例模式是多线程的一个案例,是一种常见的设计模式。两种实现单例模式的方法:1、饿汉模式2、懒汉模式阻塞队列是一个先进先出的队列入队列的时候如果发现队列满了,就会阻塞,直到有其他线程出队列后,才能继续如对类。出队列时候如果发现队列空了,也会阻塞,直到有其他线程入队列后,才能继续出队列。public class ThreadDemo3 { static class BlockingQueue { //基于数组实现 private int[] arra原创 2020-06-13 21:23:53 · 328 阅读 · 0 评论 -
Javaweb之线程2
volatileimport java.util.Scanner;public class ThreadDemo { static class Counter { public int flag = 0; } public static void main(String[] args) { Counter counter = new Counter(); Thread t1 = new Thread() {原创 2020-06-11 12:49:05 · 109 阅读 · 0 评论 -
Java中的线程
每个线程都有自己的状态,上下文,记账信息等辅助调度信息=》有一个对应的PCB,每个线程都有自己的调用栈。同时也得掌握我上篇博客写的五种创建线程的方法。并且新的线程和旧的线程之间是并发关系,只有显示调用start方法,才能真正在内核中创建线程。Thread中的run和start之间的区别:run:没有创建新的线程,输出语句实在原线程中执行的。start:这是要创建一个新的线程。创建线程创建线程方法:1.可以通过显示继承Thread类方式实现2.也可以通过匿名内部类方式继承Thread类3.原创 2020-06-08 00:02:59 · 90 阅读 · 0 评论 -
Java之Java web(冯诺依曼体系,操作系统,进程,线程的创建)
冯诺依曼体系操作系统是一个软件,搞管理的软件,一方面管理计算机硬件设备,另一方面管理计算机软件资源。一个完整的操作系统=内核+配套的应用程序。操作系统具体管理主要是两件事:1.描述2.组织进程:进程是操作系统的非常重要的软件资源如果把一个可执行程序跑起来,系统就会创建一个对应的进程,如果把这个程序结束了,系统就会随之销毁进程,进程可以看成是一个程序的执行“过程”。(是动态性的)进程是操作系统进行资源分配的最小单位。...原创 2020-06-04 17:19:50 · 223 阅读 · 0 评论