- 博客(39)
- 收藏
- 关注
原创 排序算法(一)选择排序
文章目录算法思路时间复杂度代码算法思路 选择排序的原理,从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。其步骤可总结为:在arr[0~N-1]范围上,找到最小值所在的位置,然后把最小值交换到0位置。在arr[1~N-1]范围上,找到最小值所在的位置,然后把最小值交换到1位置。在arr[2~N-1]范围上,找到最小值所在的位置,然后把最小值交换到2位置。…时间
2021-04-27 10:13:44
141
1
原创 一文读懂Java线程池
文章目录1 线程池前置知识1.1 Callable1.2 Future1.3 FutureTask2 ThreadPoolExecutor2.1 ThreadPoolExecutor继承体系2.2 ThreadPoolExecutor参数2.3 ThreadPoolExecutor任务提交流程2.4 线程工厂2.5 拒绝策略2.6 Executors提供的线程池2.6.1 newCachedThreadPool2.6.2 newFixedThreadPool2.6.3 newSingleThreadExec
2021-04-25 17:09:49
196
2
原创 深入理解ReentrantLock
文章目录前言1 可重入锁2 ReentrantLock3 AQS总结前言 保证线程安全的方式有很多,比如CAS操作、synchronized、原子类、volatile保证可见性和ReentrantLock等,这篇文章我们主要探讨ReentrantLock的相关内容。1 可重入锁 所谓可重入锁,即一个线程已经获得了某个锁,当这个线程要再次获取这个锁时,依然可以获取成功,不会发生死锁的情况。synchronized就是一个可重入锁,除此之外,JDK提供的ReentrantLock也是一种可重入锁。
2021-04-24 11:34:20
440
原创 多线程实战二
文章目录问题解法一解法二问题 写一个固定容量同步容器,拥有put和get方法,以及getCount方法,能够支持2个生产者线程以及10个消费者线程的阻塞调用。解法一 这是一个典型的生产者消费者问题,可以通过wait()和notifyAll()方法来实现。public class MyContainer4 { private LinkedList<String> list = new LinkedList<>(); private static final
2021-04-23 11:21:43
143
1
原创 多线程实战一
文章目录问题解法一解法二解法三问题 实现一个容器,提供add和size方法。写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束。解法一 使用wait()和notiry()方法实现两个线程之间的通信。public class MyContainer { List<Object> list = new ArrayList<>(); public void add(Object o) {
2021-04-23 10:09:28
157
原创 JUC使用案例
文章目录前言ReentranLockCountDownLatchCyclicBarrierPhaserReadWriteLockSemaphoreExchanger总结前言 JUC即java.util.concurrent包,这个包下面提供很多用于保证多线程安全的类,比如atomic包下面的原子类、locks包下面和锁相关的类以及其他类。在这篇文章中,我们将讲解一些常用的类的基本使用。ReentranLockCountDownLatchCyclicBarrierPhaserReadWrite
2021-04-23 09:25:33
968
2
原创 多线程之volatile
文章目录前言1 保证线程可见性2 防止指令重排序2.1 什么是指令重排序2.2 指令重排序可能造成的问题2.3 使用volatile防止指令重排序2.4 volatile防止指令重排序的原理总结前言 volatile在Java中是一个变量修饰符,其作用是保证变量在线程之间的可见性以及防止指令重排序。1 保证线程可见性 关于线程之间的可见性,在之前的文章《并发编程之可见性》中已经详细描述过,所以这里不再赘述。2 防止指令重排序2.1 什么是指令重排序 为了提升指令的执行效率,编译器会对代
2021-04-22 16:19:35
400
原创 并发编程之可见性
可见性的基本概念一个小程序public class TestThread { private static boolean flag = true; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { while (flag) { } System.out.println("t1 end"); })
2021-04-21 14:15:53
151
1
原创 线程之interrupt
interrupt概念 interrupt翻译成中文为“打断”的意思,但实际上,interrupt()方法并非将一个线程打中断的意思。查看Thread.interrupt()方法的源码:public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) { Interruptible
2021-04-20 20:51:51
1288
3
原创 线程的状态
线程状态之间的切换 线程一共有6种状态。在创建Thread对象,但还未调用start()方法时,线程为NEW状态。调用start()方法后,线程进入RUNNABLE状态。当线程等待synchronized锁时,会进入BLOCKED状态。当线程调用wait()、join()、lock()等方法时,会进入WAITING状态。当线程执行完成之后,并且Thread对象还未被垃圾回收器回收,这时线程状态为TERMINAL。代码 通过以下代码可以体现出线程状态之间的切换。public class Test
2021-04-20 19:41:19
122
原创 Hello Word!
Hello大家好!我是一位Java程序员,这是我第一次写博客。一直以来都有写博客的想法,但却因种种缘由,迟迟未能实践。今天,我终于踏出了第一步,开始我的博客之旅。写博客的目的,一是在学习的过程中,有很多知识点容易遗忘,通过写博客的方式加强记忆和巩固知识;二是希望可以把自己在学习过程中遇到的问题以及收获分享给大家。...
2021-03-28 13:59:17
125
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人