![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程和并发
文章平均质量分 94
Art&Code
艺术与代码相辅相成。
展开
-
Synchronize原理
Synchronize原理1 普通方法上2 静态方法上修饰静态方法内置锁是当前的Class字节码对象修饰普通方法内置锁是当前类的实例原理与使用: 从字节码层面解释: 执行同步代码块 monitorenter synchronized( ){ } monitorexit...原创 2019-03-01 02:53:00 · 1950 阅读 · 0 评论 -
线程池原理剖析
线程池原理剖析前面的我那几个源码截图,大家可以自己点进去看看,共同点都是封装了ThreadPoolExcutor这构造函数无非就是传递的参数不一样~~比如 SingleThreadExecutor public static ExecutorService newSingleThreadExecutor() { return new FinalizableDe...原创 2018-10-23 11:50:00 · 90 阅读 · 0 评论 -
线程池
线程池线程池什么是线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不...原创 2018-10-22 23:07:00 · 157 阅读 · 0 评论 -
使用并发队列实现生产者与消费者
使用并发队列实现生产者与消费者完全利用了阻塞队列的特性,实现了消费者生产者的关系,非常好玩!大家赶紧看看代码,然后动手默写一个吧~~package com.toov5.thread;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingDeque;import j...原创 2018-10-22 22:43:00 · 258 阅读 · 0 评论 -
Volatile关键字
Volatile关键字什么是Volatile可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存。以后用到多线程全局...原创 2018-10-22 15:48:00 · 57 阅读 · 0 评论 -
关于ThreadLocal
关于ThreadLocalThreadLocal提高一个线程的局部变量,访问某个线程拥有自己局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。ThreadLocal的接口方法ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:...原创 2018-10-22 14:54:00 · 56 阅读 · 0 评论 -
多线程死锁问题
多线程死锁问题同步中嵌套同步,导致锁无法释放package com.toov5.threadSecurity;class Thread009 implements Runnable { private int trainCount = 100; private Object oj = new Object(); public boolean flag = tru...原创 2018-10-22 03:35:00 · 185 阅读 · 0 评论 -
静态同步函数
静态同步函数什么是静态同步函数?方法上加上static关键字,使用synchronized 关键字修饰 或者使用类.class文件。静态的同步函数使用的锁是 该函数所属字节码文件对象可以用 getClass方法获取,也可以用当前 类名.class 表示。public static void sale() { //前面有static修饰了 静态的不需要被实例化 不可以用t...原创 2018-10-22 01:56:00 · 252 阅读 · 1 评论 -
多线程与Java的JMM内存模型
多线程与Java的JMM内存模型共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念...原创 2018-10-21 21:15:00 · 194 阅读 · 0 评论 -
线程优先级
线程优先级现代操作系统基本采用时分的形式调度运行的线程,线程分配得到的时间片的多少决定了线程使用处理器资源的多少,也对应了线程优先级这个概念。在JAVA线程中,通过一个int priority来控制优先级,范围为1-10,其中10最高,默认值为5。下面是源码(基于1.8)中关于priority的一些量和方法。package com.toov5.thread;class Priorit...原创 2018-10-21 20:51:00 · 97 阅读 · 0 评论 -
join()方法作用
join()方法作用当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1废话不多说看代码:package com.toov5.thread;public class JoinThreadTest { public static void main(String[] args) { Thread t1 = ...原创 2018-10-21 19:57:00 · 1302 阅读 · 0 评论 -
多线程的运行状态
多线程的运行状态多线程运行状态线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。新建状态当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码就绪状态一个新创建的线程并不自动开始运行,要执行线程,...原创 2018-10-21 19:38:00 · 114 阅读 · 0 评论 -
守护线程和非守护线程
守护线程和非守护线程直觉上来讲,守护线程和main相关Java中有两种线程,一种是用户线程,另一种是守护线程。用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止(另一条执行路径)守护线程当进程不存在或主线程停止,守护线程也会被停止。我们自己创建的线程叫 用户线程 如果主线程停止掉 不会影响用户线程(非守护线程) Java中 不光有主线程还有GC...原创 2018-10-21 19:37:00 · 118 阅读 · 0 评论 -
自定义线程池
自定义线程池如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;如果队列已经满了,则在总线程数不...原创 2018-10-23 12:49:00 · 112 阅读 · 0 评论 -
合理配置线程池
合理配置线程池CPU密集CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开几个模拟的多线程,该任务都不可能得到加速,因为CPU总的运算能力就那些。IO密集IO密集型,即该任务需要大量的IO,即大量的阻塞。在单线程上运行IO密集型的任务会导致浪费大量的CPU运算能力...原创 2018-10-23 13:50:00 · 128 阅读 · 0 评论 -
多线程的异步请求模式
多线程的异步请求模式线程池里面的submit 先来说下这个函数submit() 如果有个需求,实现下载 每个线程都会http请求 进行下载操作 run方法的缺点之一就是 没有返回值!! 多线程下载,实现下载时候 会有下载进度。主线程如何知道子线程执行完毕? run() 里面的业务实现完毕后 可以用notify wait...原创 2018-10-23 14:19:00 · 183 阅读 · 0 评论 -
(补充一)CountDownLatch
(补充一)CountDownLatch引言: 在学习单例模式时候,用到了锁synchronized的概念,在多线程中又用到了CountDownLatch的概念CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier...原创 2019-02-25 22:50:00 · 86 阅读 · 0 评论 -
Record and accumulation
Record and accumulation最近有同学在准备校招的问题,问我几个问题,我觉得有必要把大家的问题汇总下:1、在设计变量的while指挥时候,可以利用弹栈的特性以及Java传值 只是传递的副本 去控制 :https://www.cnblogs.com/toov5/p/7417084.html2、 重视逻辑 先把思路写出来 然后代码实现之3、 数组,与次数有关的 可...原创 2019-02-23 04:12:00 · 87 阅读 · 0 评论 -
线程的sleep()方法和yield()方法区别
线程的sleep()方法和yield()方法区别1.sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会2.yield()方法只会给相同优先级或更高优先级的线程以运行的机会3.线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态4.sleep()方法声明会抛出Interrupt...原创 2019-02-15 19:10:00 · 139 阅读 · 0 评论 -
通过join方法顺序执行多个线程
通过join方法顺序执行多个线程方法一:直接用多线程之间的通讯去解决package com.toov5.test;import javax.imageio.ImageTypeSpecifier;class Res1{ char flag = 'A' ;}class A extends Thread{ Res1 res; public A(...原创 2018-12-19 22:33:00 · 403 阅读 · 0 评论 -
自旋锁与互斥锁
自旋锁与互斥锁互斥锁,就是悲观锁,保证一个线程进去。线程会从sleep(加锁)--》runng(解锁) ,过程中有上下文的切换,cpu的抢占,信号的发送等开销。自旋锁:线程一直都是running(加锁--》解锁),死循环检测锁位的标志位,机制不复杂。自旋锁:由于自旋锁使用者一般保持锁时间非常短,因此选择自旋锁而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。如何自旋?什么是自...原创 2018-10-26 21:17:00 · 90 阅读 · 0 评论 -
CAS无锁机制原理
CAS无锁机制原理原子类java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法,这些 Volatile 类型的int变量在读取和写入上有着相同的内存语义...原创 2018-10-26 18:41:00 · 2021 阅读 · 1 评论 -
乐观锁和悲观锁
乐观锁和悲观锁悲观锁和乐观锁与CAS无锁机制很相关乐观锁本质是无锁的 所以没有阻塞等待嘛 效率比较高 重试 --CAS无所机制 乐观锁总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。version方式:一般是在数据表中...原创 2018-10-26 17:23:00 · 522 阅读 · 0 评论 -
读写锁
读写锁相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不...原创 2018-10-26 16:49:00 · 83 阅读 · 0 评论 -
Java锁机制-重入锁
Java锁机制-重入锁锁的种类:读写锁 悲观锁 乐观锁 CSA无锁 自旋锁 AQS 非公平锁 公平锁 互斥锁 排它锁 分布式锁(redis实现 和 zk实现)轻量级锁(lock),重量级锁(synchronize)重入锁锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已...原创 2018-10-26 15:34:00 · 214 阅读 · 0 评论 -
关于lock锁
关于lock锁在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。lock锁 也叫显示锁大家看下这个lock锁:lock是个接口这个接口下面很多锁:对于lock锁的使用,实现生产者消费者模式的:package com...原创 2018-10-23 18:41:00 · 340 阅读 · 0 评论 -
wait()和notify()
wait()和notify()从https://www.cnblogs.com/toov5/p/9837373.html 可以看到他的打印是一片一片的,这边博客介绍怎么避免掉使用notify 和 wait的时候 要注意 是在synchronize进行的,持有同一把锁1.因为涉及到对象锁,他们必须都放在synchronized中来使用. Wait、Notify一定要在synchroniz...原创 2018-10-23 17:56:00 · 141 阅读 · 0 评论 -
多线程之间的通讯
多线程之间的通讯多线程之间如何实现通讯什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 画图演示多线程之间通讯需求 需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。代码实现基本实现 下面我们看个例子 生产者 消费者package ...原创 2018-10-23 16:21:00 · 91 阅读 · 0 评论 -
多线程快速入门
多线程快速入门线程与进程区别每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实...原创 2018-10-21 16:27:00 · 65 阅读 · 0 评论