![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 54
wj?
这个作者很懒,什么都没留下…
展开
-
一、java多线程基础
多线程的概念进程是程序运行的实例。启动一个java程序其实就是启动了一个jvm的进程。进程是程序向操作系统申请资源(内存空间、文件句柄等)的基本单位。线程是进程中可以独立执行的最小单位。进程和线程的关系,可以比喻成一个项目组和组员的关系。项目组完成一个项目需要需求,开发,测试。这些往往都是并行的。需要需求,开发和测试人员协作完成。他们共享项目组的资源,如需求文档,功能代码等。为什么...原创 2018-08-04 14:40:03 · 174 阅读 · 0 评论 -
java线程池和Executor架构
为什么要使用线程池线程的创建和销毁会带来系统的开销。通过线程池进行线程的管理,可以进行线程的复用,避免线程频繁的创建和消耗。《java并发编程的艺术》 合理利用线程池能够带来三个好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会...原创 2018-09-25 21:24:35 · 197 阅读 · 0 评论 -
11、JUC之AQS中的CLH队列
CLH队列AQS内部维护着一个FIFO的队列,即CLH队列。AQS的同步机制就是依靠CLH队列实现的。CLH队列是FIFO的双端双向队列,实现公平锁。线程通过AQS获取锁失败,就会将线程封装成一个Node节点,插入队列尾。当有线程释放锁时,后尝试把队头的next节点占用锁。CLH队列结构NodeCLH队列由Node对象组成,Node是AQS中的内部类。重要属性 /...原创 2018-09-03 14:18:46 · 887 阅读 · 2 评论 -
12、ReentrantLock中的公平锁和非公平锁的原理
ReentrantLockReentrantLock内部是通过AQS实现锁的功能,有公平锁和非公平锁两种实现。公平锁,即锁的获取顺序按线程申请锁的先后顺序。 非公平锁,当一个线程t1申请锁时,锁刚好释放。即使已有其他线程在t1之前申请锁排队,线程t1还是会获取锁。这样减少了线程的等待唤醒的可能,减少上下文切换带来的开销。因为获取锁的顺序和申请顺序可能不一致所以叫非公平锁。前置技能(先了...原创 2018-09-04 18:04:59 · 593 阅读 · 0 评论 -
十、JUC之AQS
AQS即AbstractQueuedSynchronizer,是jdk提供的一个用于实现阻塞锁和依赖于先进先出等待队列的相关同步器(信号量,事件等)。AQS是concurrent包的基石。AQS 状态。它依赖一个int类型的原子变量来表示状态。private volatile int state;//共享变量,使用volatile修饰保证线程可见性对state操作的基本方法...原创 2018-09-01 21:52:24 · 188 阅读 · 0 评论 -
九、并发工具类之Semaphore
流量控制 SemaphoreSemaphore是一个计数的信号量。初始化时分配一个配额permits。在访问前需要用acquire()方法申请一个配额,访问结束后调用release()释放配置。申请配额时如果配额不足将会阻塞。例子:有2个足球,4个人射门练习。每个人射门后都要把球拿回来,后面的人才能射球。public class Player implements Runnable...原创 2018-08-24 17:46:10 · 194 阅读 · 0 评论 -
八、并发工具类之CyclicBarrier
CyclicBarrierCyclicBarrier和CountDownLatch功能相似。CyclicBarrier是所有参与线程互相等待对方执行到某点,再一起执行后面程序。与CountDownLatch一样,CyclicBarrier的构造函数也需要一个int类型的参数 parties,表示参与者数量。每一个线程调用cyclicBarrier对象的await方法就会进入等待。直到参与线...原创 2018-08-24 10:58:39 · 143 阅读 · 0 评论 -
七、并发工具类之CountDownLatch
CountDownLatch一个线程需要等到其他线程进行某操作时,可以使用CountDownLatch。 CountDownLatch构造方法,带有一个int类型的参数。public CountDownLatch(int count) 当一个线程调用countDownLatch.await()时,线程会等待。直到其他线程执行 countDownLatch.countDown()。每...原创 2018-08-23 21:21:41 · 154 阅读 · 0 评论 -
六、多线程-CAS
CAS锁的开销极大。在某些场景,如保证一个变量的 read-modify-write操作的原子性。这种场景可以通过使用CAS解决而不需要用到锁。CAS,Compare and swap 比较并交换,是一种乐观锁的实现方式。是一个中由处理器保证原子性的if-then-act操作。它通过提供一个变量内存位置,预期值(旧值)和新值。将预期值和变量的当前值进行比较,如果相等即证明变量并没有被改变,...原创 2018-08-19 21:38:18 · 627 阅读 · 0 评论 -
五、多线程协作之等待唤醒机制
线程间协作多线程开发中,线程往往都不是孤立的。一个线程往往需要多线程协作完成其待执行的任务。等待唤醒机制就是用来协调线程间的协作。例如:街边的小吃店都是生产一份等销售完再生产,这是典型的生产者消费者模式。下面用代码实现这个场景。等待唤醒机制的好处: 节省cpu。线程间通讯也可以通过轮询的方式来检查条件进行协作,但是会消耗大量cpu。用生产者/消费者模式举例。在生产者生产的时候,消费者并不需...原创 2018-08-19 19:27:24 · 310 阅读 · 0 评论 -
三、java多线程同步-锁
锁概述锁是解决线程安全问题的最基本的解决方案。通过加锁,使得会发生线程安全问题的代码单线程串行。从而解决线程安全问题。锁的分类公平锁和非公平锁公平锁是按照锁申请的顺序来分配锁资源。 非公平锁是允许插队的,可能后申请的线程比先申请的线程优先获取锁。java中锁一般默认都是非公平锁。因为公平锁为了保障公平往往会增加线程的唤醒和暂停。例如一个运行中的线程要获取锁必须先检查有没有其...原创 2018-08-08 15:17:02 · 205 阅读 · 0 评论 -
二、多线程存在的问题和Java内存模型
多线程存在的问题多线程运用得好可以大大提高系统的性能。但是使用不当也会对系统造成毁灭性灾难。线程安全问题。多个线程操作共享数据时,会产生线程安全问题。导致读取脏数据或者丢失更新等问题 线程活性问题。由于程序问题导致一个线程一直处于非Runnable状态或者处于Runnable状态但执行的任务没有紧张称为线程活性问题。例如:两个线程,线程1需要先占用锁1,再占用锁2。线程2需要先占用锁2,...原创 2018-08-06 14:44:02 · 171 阅读 · 0 评论 -
四、线程同步-volatile关键字
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 禁止进行指令重排序。 例子 private boolean stop=true; @Test public void test() throws Excep...原创 2018-08-09 11:23:15 · 219 阅读 · 0 评论 -
Fork/Join框架简介
Fork/Join框架简介fork/join是java7提供的任务并行执行的框架。fork就是将大任务分解成若干子任务,join就是将子任务的执行结果聚合成整个任务的结果。Fork/Join框架通过两个类实现ForkJoinTask ForkJoinTask负责分解任务和合并结果。通过实现compute方法,把任务分成多个子任务的ForkJoinTask,调用子任务的fork方法执行任...原创 2018-09-20 15:02:13 · 161 阅读 · 0 评论