
多线程
小白写程序
这个作者很懒,什么都没留下…
展开
-
Guava异步编程之ListenableFuture
前提:Java的Future虽然已经提供异步操作,但是不能直接回调。Guava对Future进行了增强,核心接口就是ListenableFuture。一、ListenableFuture源码解析guava对JDK的异步增强可以通过看MoreExecutor和Futures两个类的源码入手。ListenableFuture继承了Future,额外新增了一个方法,listener是任务结束后...原创 2020-01-11 17:24:45 · 2483 阅读 · 1 评论 -
Java异步编程之Future机制原理
一、回顾Runnable和Callable区别:Callable定义了call()方法,Runnale定义了run()方法。call()方法可以抛出异常,run()方法无法抛出异常。Callable有返回值,是泛型的,创建的时候传递进去,执行结束后返回。Callable执行任务的时候可以通过FutureTask得到任务执行的状态。联系:Callable的call方法实际执行在R...原创 2020-01-11 11:18:49 · 3408 阅读 · 0 评论 -
synchronized的局限性与lock的好处
synchronized的局限性与lock的好处:如果一个代码块被synchronized关键字修饰,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待直至占有锁的线程释放锁。事实上,占有锁的线程释放锁一般会是以下三种情况之一:占有锁的线程执行完了该代码块,然后释放对锁的占有;占有锁线程执行发生异常,此时JVM会让线程自动释放锁;占有锁线程进入 WAITING 状态从而释...原创 2019-10-18 23:48:24 · 365 阅读 · 0 评论 -
synchronized和lock的区别
1、synchronized是Java内置关键字,在jvm层面上,lock是个Java类。2、synchronized无法判断是否获取锁的状态,lock可以判断是否获取到锁。3、synchronized会自动释放锁,lock需要在finally中手动释放锁,否则容易造成线程死锁。4、用synchronized关键字,如果线程1获得锁,线程2会等待下去。而lock锁就不一定会等待下去,如果尝试...原创 2019-10-12 19:48:25 · 137 阅读 · 0 评论 -
Java多线程 -- 公平锁和非公平锁
简单理解公平与非公平:如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。实现原理:那如何能保证每个线程都能拿到锁呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平锁和非公平锁。在公平的锁中,如果有另一个线程持有锁或者有其他线程在等...转载 2019-09-24 09:49:15 · 228 阅读 · 0 评论 -
BlockingQueue深入解析之一DelayQueue
1、初识阻塞队列在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。BlockingQueue的核心方法:public interface Blocking...原创 2019-09-24 10:52:01 · 1069 阅读 · 0 评论 -
CAS的实现原理及Atomic的原子性
D## 一、锁机制的缺点悲观锁存在的问题:在多线程的竞争下,加锁和释放锁会导致比较多的上下文切换和调度延时,引起性能问题。一个线程持有锁会导致其他所有需要此锁的线程被挂起。乐观锁的好处:认为在并发场景下大部分时间都不会产生冲突,因此每次读写数据不加锁而是假设没有冲突去完成某项操作,如果因冲突失败就重试,直到成功为止。用到的机制就是CAS。二、CAS的实现原理CAS操作包括三个操作数...原创 2019-09-29 18:55:03 · 1783 阅读 · 0 评论 -
分布式锁之zookeeper
一、zookeeper节点的概念Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Znode。Znode分为四种类型:1、持久节点(presistent)默认的节点类型。创建节点的客户端和zookeeper断开连接后,该节点依旧存在。2、持久节点顺序节点(presistent_sequential)所谓顺序节点,就是在创建节点时,zookeeper根据创建的时...转载 2019-10-04 09:31:18 · 351 阅读 · 0 评论 -
Java多线程的各种锁
1、乐观锁:CAS乐观锁正好和悲观锁相反,它获取数据的时候,并不担心数据被修改,每次获取数据的时候也不会加锁,只是在更新数据的时候,通过判断现有的数 据是否和原数据一致来判断数据是否被其他线程操作,如果没被其他线程修改则进行数据更新,如果被其他线程修改则不进行数据更新。2、悲观锁:synchronized悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此...原创 2019-10-04 16:25:07 · 176 阅读 · 0 评论 -
多线程之线程池详解
1、线程池家族线程池的最上层接口是Executor,这个接口定义了一个核心方法execute(Runnabel command),这个方法最后被ThreadPoolExecutor类实现,这个方法是用来传入任务的。而且ThreadPoolExecutor是线程池的核心类,此类的构造方法如下:public ThreadPoolExecutor(int corePoolSize,int maxim...转载 2019-09-17 10:37:16 · 142 阅读 · 1 评论 -
线程间通信的方式
一、使用volatile关键字基于volatile关键字来实现线程间相互通信是使用共享内存的思想,就是让这个变量对所有线程都可见,一旦发生变化,都是立即可见的。public class TestSync { // 定义一个共享变量来实现通信,它需要是volatile修饰,否则线程不能及时感知 static volatile boolean notice = false; ...转载 2019-09-17 09:43:23 · 2614 阅读 · 0 评论 -
多线程的入门学习之二
4、常见函数的解读Thread类的方法:sleep(long millis):让当前正在执行的线程休息多久,暂时让出cpu给其他线程执行,但是不会释放它所占有的对象锁。join():一个正在执行的线程调用了另外一个线程的join方法,此时就会去执行另外一个线程,只有被调用的线程执行完之后,原来的线程才会继续执行下去。。为什么要用呢?在很多情况下,主线程生成并起动了子线程,如果子线程...原创 2019-08-23 23:34:40 · 108 阅读 · 0 评论 -
多线程的入门学习之三
5、常见线程名词主线程:JVM调用程序main()所产生的线程。当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,...原创 2019-08-24 11:30:05 · 130 阅读 · 0 评论 -
多线程的入门学习之四
补充:ReadWirteLock1、ReadWriteLock接口public interface ReadWriteLock { Lock readLock(); //获得读锁 Lock writeLock(); //获得写锁}2、ReentrantReadWriteLock是ReadWriteLock的实现类ReentrantReadWriteLock内部维护了两...原创 2019-08-24 15:05:17 · 110 阅读 · 0 评论 -
线程的巴拉巴拉
线程创建后,调用start方法进入就绪状态,可能正在执行或者等待。同一Thread对象上不允许两次调用start方法,会抛出异常。线程调用stop方法后进入终止状态。参考该链接...原创 2019-08-22 14:25:33 · 126 阅读 · 0 评论 -
令牌桶算法
令牌桶算法是网络流量整形和速率限制中最常用的一种算法。用来控制发送到网络上的数据的数目,并允许突发数据的发送。大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。传送到令牌桶的数据包需要消耗令牌。不同大小的数据包,消耗的令牌数量...原创 2019-08-29 15:18:03 · 1108 阅读 · 1 评论 -
定时器Timer的使用
1、介绍:设置定时器,Java中最方便,最高效的实现方式是用java.util.Timer工具类,再通过调度java.util.TimerTask任务。Timer是一种工具,可安排任务执行一次,或者周期性重复执行,实际上是一个线程,定时调度所拥有的TimerTasks任务。TimerTask是一个抽象类,它的子类继承它并实现一个run方法,需要定时执行的代码都放到run方法内。由Timer安排...转载 2019-08-29 15:57:41 · 368 阅读 · 0 评论 -
模拟多线程高并发邮件发送系统
简单邮件发送流程:服务器监听在8000端口,等待客户端连接。接收到客户端的连接,得到目标邮件,用户名等邮件发送信息。服务端连接邮件服务器,进行发送邮件。返回发送结果给客户端。继续监听端口,等待连接。优化一:对每个请求开一个单独的线程来处理,这样服务端只需要监听端口,接受请求,开线程,由线程去处理业务操作(发送邮件),提高服务端的性能。可以同时接受多个请求,实现并发。优化二:创建一...原创 2019-08-30 10:43:14 · 1359 阅读 · 0 评论 -
ConcurrentHashMap之线程安全
ConcurrentHashMap的大部分操作和HashMap是相同的,例如初始化,扩容和链表向红黑树的转变等。但是,在ConcurrentHashMap中,大量使用了U.compareAndSwapXXX的方法,这个方法是利用一个CAS算法实现无锁化的修改值的操作,他可以大大降低锁代理的性能消耗。这个算法的基本思想就是不断地去比较当前内存中的变量值与你指定的一个变量值是否相等,如果相等,则接受你...转载 2019-09-08 10:57:43 · 270 阅读 · 0 评论 -
多线程的入门学习之一
写在前面:多线程:一个进程在运行时产生了多个线程。并行:真正的同时执行,多个cpu或多台机器同时执行一段处理逻辑。并发:通过cpu调度算法,用户看上去像同时进行,实际从cpu层面看并不是。往往就是对公共资源的竞争使用。线程安全:在并发的情况下,该代码经过多线程的使用,线程的调度顺序不影响任何结果。相反如果调度顺序会影响最终结果,那就是线程不安全的,如著名的不加事务的转账代码。同步:通过...原创 2019-08-23 18:47:40 · 124 阅读 · 0 评论