JUC
文章平均质量分 56
Keep Running!
你不一定要逆风翻盘,但一定要向阳而生!
展开
-
小白日更第三天->彻彻底底搞懂单例模式!!(真的值得读)
因为最近在准备春招嘛,并且在简历上写了熟悉常见的23种设计模式,单例模式~,你懂得,那我就要搞一下这个我们程序员都听过的大名鼎鼎的单例模式!23种设计模式我就不多赘述了,我认为单例模式(Singleton Pattern)是java最简单的设计模式之一。设计模式一共分为三种,这种类型的设计模式属于创建型模式,设计模式一共分为三种,它为我们提供了一种创建对象的最佳方式。科普一下->总体来说设计模式分为三大类:(我也是刚刚百度的_-_)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者原创 2021-03-05 19:37:05 · 270 阅读 · 10 评论 -
小白日更第六十八天->BlockingQueue(阻塞队列)的四组API
第一组add()方法添加数据package com.qcby.algorithm;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;public class TestDemo5 { public static void main(String[] args) { BlockingQueue<Integer> blockingQueue原创 2021-04-12 21:28:45 · 198 阅读 · 0 评论 -
小白日更第六十七天->同步异步,阻塞和非阻塞的区别
同步和异步同步:当一个同步调用发出去后,调用者要一直等待调用结果的返回后,才能进行后续的操作。异步:当一个异步调用发出去后,调用者不用管被调用方法是否完成,都会继续执行后面的代码。 异步调用,要想获得结果,一般有两种方式:1、主动轮询异步调用的结果;2、被调用方通过callback来通知调用方调用结果;其实总结的话就是:同步和异步是相对服务器端来说的。服务器在受到我们的请求后,如果立刻给我们返回一个响应,哪怕没有返回给我们需要的信息,只是简单的给我们一个相应。那就是异步的。如果是在找到我们需要的资原创 2021-04-12 17:23:02 · 76 阅读 · 0 评论 -
小白日更第六十六天->Java死锁排查
先看我的死锁代码:package com.qcby.algorithm;public class TestDemo4 { public static String a="资源A"; public static String b="资源B"; public static void main(String[] args) { new Thread(()->{ synchronized (a){ try {原创 2021-04-12 17:09:57 · 98 阅读 · 2 评论 -
小白日更第六十四天->为什么要使用多线程
摩尔定律:我们知道我们的多线程是在多核CPU的硬件条件下。我们现在的电脑一般都是起码四核的。我看一下我的电脑是几核的:没记错的话,插槽的个数应该指的是CPU的个数,而逻辑处理器指的应该是CPU的核心数。所以那为什么要使用多线程呢?1、充分利用CPU的计算能力我们的CPU是多核的,闲着也是闲着,为什么不利用起来呢?我们要把CPU的计算能力发挥到极致。线程是大多数操作系统调度的基本单元,一个程序作为一个进程来运行,程序运行过程中能够创建多个线程,而一个线程在一个时刻只能运行在一个处理器核心上。试想原创 2021-04-12 16:14:39 · 139 阅读 · 0 评论 -
小白日更第六十二天->继上一篇ArrayList并发问题
上一篇我对ArrayList做了一个简单的并发测试,感觉很好玩,今天晚上又测试了一下,因为上一篇博客中测试的数据量太少了,我创建了4个线程,每个线程插入几百条数据,偶尔会报错,我上午把程序运行了不下20次,很少报错,并且也很少发生数据覆盖带来的丢失问题。今天晚上我创建了五条线程,每条插入十万条数据。然后我们看运行结果数组下标越界我在上一篇博客中叙述了,我再说一下,是这样的。我们在多线程插入数据的时候,会有这么一种比较极端的情况,当前数组还剩最后一个位置,两个线程要在这个位置插入数据,一个线程先插入完之后原创 2021-04-11 20:20:18 · 84 阅读 · 0 评论 -
小白日更第六十一天->你没见过的ArrayList并发问题
关于ArrayList我们都知道它是集合不安全的集合类。今天闲的无聊,敲了一下,想看一下在多线程的情况下插入数据会不会报并发修改异常的错误。先看代码:package com.qcby.algorithm;import java.util.*;public class TestDemo { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>();原创 2021-04-11 10:23:30 · 301 阅读 · 1 评论 -
小白日更第四十九天->为什么wait()方法必须在同步方法/代码块中调用?
在JAVA中,所有的对象都能够被作为‘监视器monitor’——指的是一个拥有一个独占锁,一个入口队列,和一个等待队列的实体entity。所有对象的非同步方法都能在任意时刻被任意线程调用,此时不需要考虑加锁的问题。而对于对象的同步方法来说, 在任意时刻有且仅有一个拥有该对象独占锁的线程能够调用它们。 例如,一个同步方法是独占的。如果在线程调用某一个对象的同步方法的时候,对象的独占锁被其他线程占有,那么当前线程将处于阻塞状态。并添加到对象的入口队列中。只有在调用线程拥有的某个对象的独占锁的时候,才能够调用该原创 2021-04-07 17:35:02 · 1569 阅读 · 0 评论 -
小白日更第四十八天->线程sleep和wait、阻塞和等待的区别
sleep()和wait()sleep()源码sleep()源码注释wait()源码wait()源码部分注释:第一个区别:wait()属于Object类的,sleep()属于Thread类的第二个区别:我特意把sleep()源码的最后一句去翻译了一下:简单从其注释中可知,线程并不会失去对任何监视器(monitors)的所有权,也就是说不会释放锁,仅仅会让出cpu的执行权。可以理解成是抱着锁睡觉的。根据注释中的一句话,可以看出此方法调用的前提是当前线程已经获取了对象监视器mo原创 2021-04-07 16:54:42 · 588 阅读 · 2 评论 -
小白日更第四十七天->线程的六种状态
线程可以有如下 6 种状态:•New (新创建)•Runnable (可运行)•Blocked (被阻塞)•Waiting (等待)•Timed waiting (计时等待)•Terminated (被终止)新建线程当用 new 操作符创建一个新线程时, 如 newThread®, 该线程还没有开始运行。这意味着它的状态是 new。当一个线程处于新创建状态时, 程序还没有开始运行线程中的代码。在线程运行之前还有一些基础工作要做可运行线程一旦调用 start 方法,线程处于 runnabl原创 2021-04-07 16:23:01 · 139 阅读 · 3 评论 -
小白日更第四十四天->Semaphore的简单demo
还是先看一下Semaphore类所在的位置:还是JUC下面的。这个Semaphore我们可以简单理解为一个通行证,只有线程拿到这个通行证才可以执行相应的代码,没有拿到通行证就要等拿到通行证的线程释放通行证以后再来尝试获取这个通行证,然后执行相应的代码。下面我们来看一个最简单的抢车位的小demo:小伙伴们可以想一下运行结果是怎么样的我注意到这个Semaphore的构造函数有两个,一个是传一个int类型数值,也就是通行证的数量。另外一个构造函数是传一个int数值和一个boolean值那我们在刚原创 2021-04-07 10:54:21 · 115 阅读 · 0 评论 -
小白日更第四十三天->CyclicBarrier的简单demo
还是先看一下CyclicBarrier类所在的位置还是JUC下面的。CyclicBarrier是允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。CyclicBarrier支持一个可选的Runnable命令,每个屏障点运行一次,在派对中的最后一个线程到达之后,但在任何线程释放之前。 在任何一方继续进行之前,此屏障操作对更新共享状态很有用。demo:package原创 2021-04-07 00:30:51 · 120 阅读 · 0 评论 -
小白日更第四十二天->CountDownLatch的简单demo
先看一下CountDownLatch所在的位置位于JUC并发包下面的。允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。A CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使CyclicBarr原创 2021-04-06 22:28:59 · 98 阅读 · 0 评论 -
小白日更第二十天->并发之Semaphore
其实关于并发下的Semaphore还是比较简单的,可以理解为一个信号量,它有一个acquire方法,可以理解为颁发一个通行证,只有拿到了这个通行证才可以执行代码块,使用完要还回来以便其他线程使用,其实听我这么说不如看一个例子来的实在:我们可以看到其中一个构造函数需要传一个int类型数据,这个参数就是相当于有几个通行证可以颁发。当通行证都用完了,那其他线程就必须等待有线程把通行证还回来之后再尝试获得通行证。这个例子很好理解,大家可以自己想一下结果是什么,也可以自己敲一下,边敲边想~for循环创建1原创 2021-03-22 23:03:25 · 92 阅读 · 1 评论 -
小白日更第十天->进程和线程的区别
进程老规矩先看百度百科~其实也就是在我们windows上的一个正在执行的.exe程序。这个是我刚刚截的图,当前我电脑正在执行的线程有238个,线程有3122个。所以我们会常听到一个进程会有多个线程,现在看来也不是没有道理哈哈。那什么是线程呢?进程中的一个执行任务,负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈。我举个例子可能更有助于小伙伴们理原创 2021-03-17 16:04:15 · 123 阅读 · 4 评论