![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
拾荒路上的开拓者
开拓,前行!矫情?不存在的……
展开
-
Synchronize的对象锁与类锁的区分
对象锁Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待,synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。这里也体现了用synchronized来加锁的一个好处,方法抛异常的时候,锁仍然可以由JVM来自动释放。 // 对象锁:形式1(方法锁) public synchronized void Method1() {原创 2022-01-23 15:43:12 · 245 阅读 · 0 评论 -
简易实现Java的NIO
NIO (New I/O): NIO是一种同步非阻塞的I/O模型,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 Serve...原创 2020-05-05 23:23:45 · 465 阅读 · 0 评论 -
排除Full GC影响时间流计算的技巧
在日常Java开发中,异步线程处理相关业务是司空见惯的事,在异步线程处理监控中又经常会对其执行时间进行监控分析,比如运行时间是否超时等。原创 2020-04-28 21:27:02 · 292 阅读 · 0 评论 -
Java实现归并排序(递归与非递归)
归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成...原创 2020-02-23 12:17:32 · 592 阅读 · 1 评论 -
CopyOnWrite的实现机制
原文连接《CopyOnWrite的实现机制》1、什么是CopyOnWrite和单词描述的一样,他的实现就是写时复制, 在往集合中添加数据的时候,先拷贝存储的数组,然后添加元素到拷贝好的数组中,然后用现在的数组去替换成员变量的数组(就是get等读取操作读取的数组)。这个机制和读写锁是一样的,但是比读写锁有改进的地方,那就是读取的时候可以写入的 ,这样省去了读写之间的竞争,看了这个过程,你也发...转载 2020-02-17 19:33:58 · 306 阅读 · 0 评论 -
CompletionService的使用
CompletionService是Java8的新增接口,JDK为其提供了一个实现类ExecutorCompletionService。这个类是为线程池中Task的执行结果服务的,即为Executor中Task返回Future而服务的。CompletionService的实现目标是任务先完成可优先获取到,即结果按照完成先后顺序排序。1、成员变量CompletionService的使用非常简...原创 2020-02-17 17:23:07 · 461 阅读 · 0 评论 -
JDK的线程池和工作机制
1、ThreadPoolExecutor在JDK中,所有预定义的线程池都是继承自父类ThreadPoolExecutor1.1 线程池创建其构造方法如下:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, ...原创 2020-02-16 22:47:26 · 316 阅读 · 0 评论 -
Java自定义线程池ThreadPool
public class SelfThreadPool { //线程池中默认线程的个数为5 private static int WORK_NUM = 5; //队列默认任务个数为100 private static int TASK_COUNT = 100; //工作线程组 private WorkThread[] workThreads;...原创 2020-02-16 17:34:42 · 254 阅读 · 0 评论 -
并发容器ConcurrentHashMap——JDK1.7与JDK1.8区别
在Java常用的容器HashMap存在着线程不安全的问题,其中JDK1.7与JDK1.8的线程不安全会出现不同的情况:在多线程情况下,JDK1.7在HashMap在扩容时会造成环形;在JDK1.8中可能会发生数据覆盖。1、JDK1.7下的ConcurrentHashMapConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment实际继承自可...原创 2020-02-16 13:47:21 · 725 阅读 · 0 评论 -
Java线程的并发工具类
1、Fork-JoinFork/Join框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可拆发),再将一个个的小任务运算的结果进行join汇总。MapReduce就是这种思想。Fork/Join的标准使用范式:实现案例:public class MakeArray { public static final int ARRAY_LEN...原创 2020-02-09 22:51:19 · 184 阅读 · 1 评论 -
Java线程基础
1、如何让Java线程安全停止工作自然执行完 抛出异常 主动停止2、如何安全地主动停止stop()、resume()、suspend()这些方法不会释放资源,已经被废弃java线程是协作式的interrupt()中断一个线程,并不是强行关闭这线程,而是通知该线程需要关闭,线程收到通知后自动根据实际运行情况才安全关闭。isinterrupted()判定当前线程是否处于中断状...原创 2020-02-08 18:27:52 · 171 阅读 · 0 评论 -
synchronized对象锁与类锁的区别
synchronized关键字涉及到锁的概念,在java中,synchronized锁大家又通俗的称为:方法锁,对象锁和类锁 。关于锁只有以下两点:无论是修饰方法还是修饰代码块都是对象锁,当一个线程访问一个带synchronized方法时,由于对象锁的存在,所有加synchronized的方法都不能被访问(前提是在多个线程调用的是同一个对象实例中的方法) 无论是修饰静态方法还是锁定某个...原创 2020-02-07 22:21:14 · 895 阅读 · 0 评论 -
Java中ServiceLoader实现方式
在java中根据一个子类获取其父类或接口信息非常方便,但是根据一个接口获取该接口的所有实现类却没那么容易。有一种比较笨的办法就是扫描classpath所有的class与jar包中的class,然后用ClassLoader加载进来,然后再判断是否是给定接口的子类。但是很显然,不会使用这种方法,代价太大。java本身也提供了一种方式来获取一个接口的子类,那就是使用java.util.Servi...原创 2020-02-03 23:25:26 · 578 阅读 · 0 评论 -
HashMap线程不安全的体现
前言HashMap是线程不安全的,在多线程环境中不建议使用。但是HashMap线程不安全主要体现在什么地方呢?下文对该问题进行了剖析。1、JDK1.7中的HashMap在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jdk1.7多线程环境下HashMap容易出现死循环,这里我们先用代码来模拟出现死循环的情况:public cla...原创 2019-12-23 23:22:23 · 115 阅读 · 0 评论 -
Java实现二叉搜索树的遍历
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。在遍历前先定义一个二叉搜索树:public class BinarySearchTree<E...原创 2019-12-17 20:29:39 · 124 阅读 · 0 评论 -
Map中hash()
1、哈希Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。根据同一散列函数计算出的散列值如果不同,那么...原创 2019-12-16 20:19:34 · 152 阅读 · 0 评论