java
文章平均质量分 76
java基础信息、线程等
乐观的大鹏
一个被java吊打了n次的渣渣鹏
展开
-
从代码案例了解ThreadLocal的作用以及原理
本文主要是对上篇中ThreadLocal进行一个小讲解https://blog.csdn.net/qq_38340127/article/details/109866392,若有错误希望观众老爷们帮忙指出下,我好改进谢谢。一、ThreadLocal的作用在源码中有一段这样的注释: * This class provides thread-local variables. These variables differ from * their normal counterparts in t原创 2020-11-24 23:35:51 · 720 阅读 · 2 评论 -
线程中更改全局变量的问题
线程中更改全局变量例子:package 并发编程;public class ConcurrencyTest {public static volatile long count = 100001;public static void main(String[] args) throws Exception {// TODO Auto-generated method stubconcurrenc...原创 2017-08-08 12:16:24 · 7448 阅读 · 0 评论 -
ThreadPoolExecutor作用以及原理解析
1.线程池出现的原因: 在多线程的情况下,多个线程在创建和销毁的阶段会消费很多时间,占有很多资源,线程池为了减少在创建和销毁的资源下出现:2.JAVA中的ThreadPoolExecutor线程池2.1 线程池的运行方式 当线程池中获取到一个需要执行的线程的时候,是如何运行的呢? 此处可以通过对源码的查看了解: public voi...原创 2019-07-28 14:33:29 · 251 阅读 · 0 评论 -
BlockingQueue的作用以及实现的几个常用阻塞队列原理
1、BlockingQueueBlockingQueue为阻塞队列,其与普通队列不同的是,以put和get为例,阻塞队列在put时,若列表满了,则会等待直到队列可以加入元素;而阻塞队列在get时候,若列表为空,则会等待到队列非空。可以用来解决 生产者消费者问题。2、ArrayBlockingQueue阻塞队列在add时,若列表满了,则抛出异常;阻塞队列在offer时根据不同参数决定;阻塞队列在put时,若列表满了,则会等待直到队列可以加入元素;阻塞队列在get时候,若列表为空,则会等原创 2020-12-18 00:06:28 · 772 阅读 · 0 评论 -
Fork/join框架
Fork:就是把大任务分割成若干个子任务并行的执行/Join就是合并这些子任务的执行结果。工作窃取算法:某个线程从其他队列里窃取任务来执行。被窃取任务线程永远从双端队列头部执行任务,而窃取任务的线程永远从双端队列的尾部拿任务执行。工作窃取算法优点:充分利用线程进行并行计算减少了线程间的竞争。工作窃取算法缺点:在某些情况下还是存在竞争,比如双端队列里只有一个任务时。并且该算法会消耗了更多原创 2017-08-08 16:53:22 · 252 阅读 · 0 评论 -
java并发编程的艺术-并发工具类
1.等待多线程完成的CountDownLatch允许一个或多个线程等待其他线程完成操作。join用于让当前执行线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远的等待。其中,wait(0)表示永远等待下去,代码片段如下while(isAlive()){wait(0);}直到线程终止后,线程的this.notifyAl翻译 2017-08-09 08:50:28 · 267 阅读 · 0 评论 -
ConcurrentHashMap学习笔记
ConcurrentHashMap为线程同步的Map实现,并采用了分段锁的设计,分段锁称为Segment,它即类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment继承了ReentranLock)。其结构图如下:其类图信息如下ConcurrentHashMap的操作:1.get操作C原创 2017-08-08 14:43:34 · 262 阅读 · 0 评论 -
ConcurrentHashMap的实现原理与使用(更新)
ConcurrentHashMap是线程安全且高效的HashMap。在并发编程中使用HashMap可能导致程序死循环。而使用,线程安全的HashTable效率又非常低下,基于以上原因便有了ConcurrentHashMap。(1)线程不安全的HashMap在多线程环境下,使用HashMap进行put会引起死循环,导致cpu利用率接近100%,所以在并发情况下不能使用HashMap。例如,执行...原创 2017-08-08 11:23:51 · 294 阅读 · 0 评论 -
LinkedList分析
LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的。基于链表也决定了它在随机访问方面要比ArrayList逊色一点。 除此之外,LinkedList还提供了一些可以使其作为栈、队列、双端队列的方法。这些方法中有些彼此之间只是名称的区别,以使得这些名字在特定的上下文中显得更加的合适。转载 2017-08-10 14:13:35 · 236 阅读 · 0 评论 -
HashMap源码解析-关于二叉树和红黑树
二叉树:用java基本代码可以表示为(掌握遍历算法 前序,中序,后续 熟练使用递归)publicclass TreeNode { // 左节点 private TreeNode lefTreeNode; // 右节点 private TreeNode rightNode; // 当前结点的值 private int value; ...原创 2019-04-17 21:09:39 · 2350 阅读 · 0 评论 -
LinkedHashMap源码分析
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>继承HashMap 并实现了Map的接口其中HashMap用Node<K,V>[] table;实现了桶,即相当于用数组实现了 List(类似于arraylist)那么Linked...原创 2019-04-17 22:56:26 · 118 阅读 · 0 评论 -
HashMap源码解析
HashMap<K, V>集成了AbstractMap<K, V>,并实现Map<K, V>, Cloneable, Serializable接口其中接口Map<K,V>中含有大量default修饰的 方法体如:default V getOrDefault(Object var1, V var2) { Object var...原创 2019-04-17 21:10:03 · 196 阅读 · 0 评论 -
运用多线程批量保存数据问题导致根据id查找出现中间被插入数据情况
最近项目基于springboot结合mybatis的情况下,同时运用多线程的批量保存的情况下,发现了一个严重问题,代码中开启了多个线程对数据进行插入,此时在运用另一个接口对已经保存的数据进行根据id升序排序获取的情况下,会出现id出现错乱的情况。上图中左边为一开始的查询结果,右边为过段时间后查询的结果,明显在中间插入了一段数据。为什么出现这种问题?对事务进行复习下吧:事务:...原创 2019-07-24 19:20:21 · 699 阅读 · 0 评论 -
数据结构-堆
堆通常是一个可以被看做一棵树的数组对象(用数组实现的二叉树)。堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。(完全二叉树要求,除了最后一层,其它层的节点个数都是满的,并且最后一层的节点都靠左排列。) 将根节点为最大的值的称为最大堆,根节点为最小值的堆称为最小堆。 堆和二叉树的区别: 堆仅仅用了数组,无二...原创 2019-07-05 17:48:00 · 121 阅读 · 0 评论 -
反射学习笔记
以Test类为例public class Test{ public int age; public void getAge(){ return age; }}1.类对象Class的获取 方法一: Class class = Test.class; 方法二:Class cl...原创 2019-07-03 19:30:00 · 154 阅读 · 0 评论 -
java单例模式-3大基础实现
所谓单例模式 类对象只有一个实例。1.饿汉式:因为静态变量在初始化的时候,便已经创建,故只要不调用class.forName等方法,该形式便是线程安全//饿汉式 线程安全public class Singleton { private static Singleton singleton = new Singleton(); private Singleto...原创 2019-07-28 15:48:08 · 154 阅读 · 0 评论 -
java线程池的代码中的retry: 跳出循环
最近在看线程池的代码时候发现一块特殊的循环:这个retry是怎么一回事?具体用了一个测试用例进行:首先是一个最原始的循环: for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { System.out.println(i+" "+j); if(j ==3) { continue;//这里调用cont...原创 2019-07-18 17:40:36 · 477 阅读 · 0 评论 -
java的final和static关键字
final关键字1.final修饰类 表示该类无法被继承,如String类则为public final class String{}2.final修饰方法 表示该方法无法被重写(private修饰的方法默认为final修饰)3.final修饰变量 表示该变量为不可变的值,在被赋值后无法更改 ...原创 2019-08-12 11:10:44 · 134 阅读 · 0 评论 -
java中的泛型方法
一开始看到泛型方法的时候是蒙蔽的- -完全忘记了自己学过并写过类似的代码不过是否拥有泛型方法,与其所在的类是否是泛型没有关系。作用:泛型方法使得该方法能够独立于类而产生变化。以下是一条基本的指导原则:无论何时只要你能做到,你就应该尽量使用泛型方法。对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。如何定原创 2017-08-10 19:26:50 · 446 阅读 · 0 评论 -
java最基础的死锁产生,以及对应条件
死锁案例:public class DeadLock { public static String a = "a"; public static String b ="b"; public static void main(String[] args) { Thread a = new Thread(new lo...原创 2019-08-08 15:13:19 · 151 阅读 · 0 评论 -
JDK动态代理实现原理
JDK动态代理步骤:(只能对实现接口的类进行代理) 1.创建被代理的接口和类; 2.创建InvocationHandler接口的实现类,在invoke方法中实现代理逻辑; 3.通过Proxy的静态方法newProxyInstance( ClassLoader classLoader, Class[] interfaces, InvocationHandler inv...原创 2019-06-28 10:18:19 · 1315 阅读 · 0 评论 -
Java编程思想-笔记
一.哪些对象可以作为gc root:1.虚拟机栈中引用的对象2.方法区中常量引用的对象3.方法区中类静态属性引用的对象4.本地方法栈中JNI(即一般说的native方法)引用的对象什么是类静态属性(以及静态方法):首先静态属性和方法必须用static修饰符,static 可以修饰属性、方法、代码块、内部类静态属性(方法)和非静态属性(方法)的区别:一:内存中...原创 2019-05-30 22:12:55 · 1007 阅读 · 0 评论