多线程
匣与桔
你有多努力就有多优秀。加油!
展开
-
并发编程思维导图
自己对并发编程这块用思维导图的方式做了个总结,方便以后回顾,目前涵盖的可能还不全,后续更新吧。其中的内容也是资料结合个人理解,有什么不对的地方还请指出,共同进步。其中有些地方有做的一些笔记,导图上面没有体现出来,有需要的话私信留言都行。...原创 2020-06-12 22:20:59 · 521 阅读 · 0 评论 -
死磕并发之先行发生原则(happens-before)
程序次序原则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写后面的操作。准确的说,应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。程序锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是同一个“锁”,而“后面”是指时间上的先后顺序。volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这...原创 2020-05-04 23:37:24 · 191 阅读 · 0 评论 -
死磕并发之线程池核心参数
为什么要用线程池呢?虽然创建线程看起来很简单,只需要new Thread()就可以了,但实际上创建线程远不止创建一个对象这么简单。创建对象,仅仅是在堆内存中分配一块内存而已,而创建线程则需要调用操作系统内核API,然后操作系统要为线程分配一系列的资源,这个成本比创建一个对象时要高很多的。所以线程是一个重量级的对象,应避免频繁创建和销毁。线程池几个核心参数corePoolSiz...原创 2020-04-24 22:03:22 · 223 阅读 · 0 评论 -
死磕并发之ReadWriteLock读写锁的使用
所有读写锁都要遵循以下三条基本原则:允许多个线程同时读共享变量。只允许一个线程写共享变量。如果一个线程正在执行写操作,此时禁止读线程读共享变量。总结: 读-读可以,读-写互斥,写-写互斥。注意:写锁可降级为读锁,读锁不能升级为写锁。简单使用示例public class ReentranReadWriteLokeDemo<K, V> { priva...原创 2020-04-22 22:45:58 · 456 阅读 · 0 评论 -
死磕并发之Semaphore的使用
Semaphore的模型可以简单的概括为:一个计数器,一个等待队列,三个方法。在信号量模型里,计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问它们,这三个方法分别是:init()、down()、up()init():设置计数器初始值。down():计数器的值减 1;如果此时计数器的值小于 0,则当前线程将被阻塞,否则当前线程可以继续执行。up():计数器...原创 2020-04-22 22:22:33 · 151 阅读 · 0 评论 -
死磕并发之CyclicBarrier的使用
CyclicBarrier和CountDownLatch的不同是CyclicBarrier的计数器有自动重置的功能CyclicBarrier有提供回调函数的功能,当计数器减到0时,会调用这个回调函数。简单使用例子:public class CyclicBarrierDemo { static CyclicBarrier cyclicBarrier = new ...原创 2020-04-22 22:20:26 · 332 阅读 · 0 评论 -
死磕并发之CountDownLatch的使用
CountDownLatch和join的作用类似。joinThread.join()方法使线程等待,待线程退出时,调用Thread.join()的主线程会被唤醒,从而执行后续操作。当处于线程池的状态下,线程不会退出,join就会一直执行不到。如下示例,会先输出“执行结束”,然后输出 “Child thread running”public class ThreadJoinD...原创 2020-04-22 22:18:09 · 182 阅读 · 0 评论 -
死磕并发之到底创建多少个线程合适
为什么要使用多线程?使用多线程的目的就是提升程序性能,在并发编程领域,提升性能本质上就是提升硬件的利用率,再具体点来说,就是提升 I/O 的利用率和 CPU 的利用率。而解决的方案就是多线程。知道了解决方案,问题又来了,创建多少个线程合适呢?多了会造成CPU上下文切换,浪费资源不说性能还上不去,少了吧CPU利用率又上不去。接下来让我们分析下到底创建多少个线程比较合适。创建多少个线程合适...原创 2020-04-19 16:40:24 · 789 阅读 · 0 评论 -
死磕并发之线程的生命周期详解
文章开始大家思考一个问题,执行了Thread的start方法之后就代表该线程已经开始执行了吗?相信大家看完文章应该就能找到答案。一.线程的生命周期大致分为以下5个阶段1.NEW2.RUNNABEL3.RUNNING4.BLOCKED5.TERMINATED接下来让我们看下这5个阶段分别代表什么。二.线程的NEW状态我们使用new关键字创建一个Thread对象时,...原创 2020-04-19 15:11:24 · 149 阅读 · 0 评论 -
java锁机制
1.重入锁1.重入锁又名递归锁。指的是同一线程,外层函数获得锁后,内层递归函数仍然获取该锁。ReentrantLock(显示锁,轻量级锁)和synchronized(内置锁,重量级锁)都是可重入锁。2.悲观锁、乐观锁、排它锁1.悲观锁:悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时都会加上排它锁。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,...原创 2019-04-09 21:09:55 · 115 阅读 · 0 评论 -
并发编程面试题(线程池)
1.什么是线程池?答:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。通俗点将,线程池就是一个容器,集中管理线程。线程使用完毕不会销毁,而是会先存储在线程池内。2.线程池的作用?答:1.降低资源消耗。 2.提高响应速度。 3.提高线程的可管理性。3.常见的线程池有哪几种?答:有四种。1.newCac...原创 2019-04-02 21:19:55 · 1934 阅读 · 0 评论 -
并发编程面试题(基础)
1.进程与线程的区别?答:进程是所有线程的集合,每一个线程是进程的一条执行路径。2.为什么要用多线程?答:提高程序效率3.创建线程的方式?那种方式比较好?答:1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程。有返回值,可以声明抛出异常。实现Runnable的方式比较好,可以继...原创 2019-04-01 20:56:22 · 578 阅读 · 0 评论 -
并发编程(并发队列)
1.阻塞队列和非阻塞队列的区别?答:阻塞队列:当队列时空的,从队列中获取元素操作将会被阻塞,或者当队列满时,往队列里面添加时将会被阻塞。2.有哪些队列?答:1.ArrayDeque (数组双端队列)2.PriorityQueue (优先级队列)3.ConcurrentLiken...原创 2019-04-03 20:56:59 · 174 阅读 · 0 评论