![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 56
InAHurryv
或取诸怀抱悟言一室之内
展开
-
Thread类为什么要弃用stop resume suspend ?
1、stop对于stop方法会立即停止某个运行线程的执行,不管正在执行的线程在执行什么正常操作。所以如果直接stop 可能会导致文件不会正常关闭,try catch 也不会再执行。 另外 stop 会立即释放运行线程它锁定的监视器对象。这样会导致其他线程提前得到了未完全“初始化”的数据,导致数据不一致。This method is inherently unsafe. Stopping a thread with* Thread.stop causes it to unlock all原创 2021-09-20 13:32:33 · 224 阅读 · 0 评论 -
collection 转Map
public static <E,K,V> Map<K,V> listToMap(Collection<E> collection, Function<? super E,? extends K> keyMapper,Function<? super E,? extends V> valueMapper){ if(collection == null || collection.size() == 0){ ...原创 2021-09-10 23:51:45 · 670 阅读 · 0 评论 -
AtomicInteger 原子类
1、getAndIncrement 方法底层使用了unsafe.getAndAddInt(object,offset,deta)int getAndAddInt(Object,offset,int deta){ int v ; do{ v = unsafe.getIntVolatile(object,offset); }while(!unsafe.compareAndSet(object,offset,v,v+1)) return v;}2、incrementAndGet()方原创 2021-09-06 11:59:04 · 72 阅读 · 0 评论 -
CMS垃圾收集器
1、可达性分析 & 引用计数法在cms垃圾收集器的初始标记的时候,标记的就是俩部分:一是 GC roots 引用的老年代对象 二是新生代引用的老年代对象。而可达性分析所用的GC roots 包括虚拟机栈 中本地变量表中的变量引用的对象、方法区中的静态变量、常量引用的对象、本地方法栈中的JNI引用的对象。2、CMS工作流程初始标记这时要stw并发标记用户线程和垃圾回收线程同时进行,从初始阶段标记的存活对象开始标记所有的存活的对象。由于用户线程也在运行,所以对象的申请以及老年代引用关系原创 2021-09-05 22:29:06 · 98 阅读 · 0 评论 -
线程池的使用-java
理解:线程池的顶级接口时Executor,其中只有一个execute方法,ThreadPoolExecutor 中有7个参数,是coreThread、maxThreads、keepaliveTime(超出核心线程的线程超时时间、超过该时间需要销毁线程) 、timeunit、BlockingQueue、ThreadFactory(可以自定义线程名)、Handler拒绝策略。 从阿里的java规范来说:直接使用ThreadPoolExecutor 而不是使用Executors 工厂方法来创建newFixedT原创 2021-09-02 14:48:57 · 216 阅读 · 0 评论 -
ThreadLocal学习
概述ThreadLocal 译为线程本地变量,适用场景有很多总结起来就是一个:只希望在本线程使用的变量。用户从浏览器发起请求,服务器有相应的线程处理请求,但是http无状态,session 可以用来保存一些状态只与用户此次会话相关,此时我们就可以使用线程本地变量来保存session。注意一个线程不是为一个用户服务的,当使用完成之后进行remove 本地变量,防止内存泄漏。同一个线程处理非常复杂业务的时候,可以将显式传递的参数当作线程本地变量,从而可以在多个方法中使用。在数据库连接的时候可以使用Thr原创 2021-08-04 17:10:03 · 137 阅读 · 0 评论 -
ConcurrentHashMap1.8学习
目标了解ConcurrentHashMap 工作原理。重点了ConcurrentHashMap的多线程下的扩容机制,TreeBin 、ForwardingNode 功能的认识,以及CAS和LockSupport的使用。预备知识重要属性源码讲解put 函数public V put(K key, V value) { return putVal(key, value, false); }final V putVal(K key, V value, boolean o.原创 2021-08-04 16:29:23 · 381 阅读 · 2 评论 -
ConcurrentHashMap1.7学习
目标学习ConcurrentHashMap 1.7 如何保证线程安全的,及其工作流程。预备知识为什么需要ConcurrentHashMaphashtable 只是简单地将需要同步的方法加上"synchronized",使得多个线程可能竞争同一把锁。HashMap 不能保证线程安全,甚至在并发环境元素成环导致cpu飙升。Collections.synchronizedMap 也是所有线程竞争同一把锁,该锁默认情况下Map实例,也可以自定义。volatile 关键字并发编程中的可见性、原子性、原创 2021-08-04 15:47:54 · 145 阅读 · 0 评论 -
哈希表1.8学习
目标通过hashMap 常用的put 和get 函数 来切入了解整个hashMap 的工作流程,了解红黑树的插入与删除,熟悉HashMap1.7 与1.8的异同,以及使用HashMap的最佳规范。预备知识红黑树的插入设待插入节点为 N(New),父节点为P(Parent)叔父节点 U(Uncle) 祖父节点为G(Grandpa)规定待插入的节点为红色如果父节点p为黑色,直接插入p为红色,1 叔父节点U 为null 旋转 + 变色 (旋转祖父节点)2 叔父节点 U 为 红色,变色 (U P原创 2021-08-04 11:27:32 · 3283 阅读 · 0 评论 -
哈希表1.7 学习
学习目标了解HashMap 1.7 整体结构,从put get 操作了解HashMap 工作流程,及其存在的问题。整体结构从一个算法题讲起如何得到大于或者等于某个正数的2的幂次方数?public int getBiggerOrEqual(int size){//假设size 是 大于0的// 大致分为 2 类数据 一类是本身就是符合要求的2 的幂次方数 另一类就是不符合 其二进制数有多个bit 为1if(size == 1){return 1;}return Integer.high原创 2021-08-04 10:45:53 · 235 阅读 · 0 评论 -
实习HashMap1.7
作为一条通用的规则,loadfactor 设置为0.75.这是时间和空间的权衡选择,要是特别大那么可能存在这样的情况:hash冲突特别严重但是就是没达到阈值,而如果小点的话就能减轻这种情况。所以 loadfacor 特别大应该会影响get 和put 操作的时间复杂度。特别小的时候又会造成空间的浪费。“collection views method” 会fail fast 抛出并发修改异常。如何找到大于等于某个数的最小2的幂次方数? private static int roundUpToPowe原创 2021-06-19 13:30:58 · 171 阅读 · 0 评论 -
LongAdder 的理解与使用场景
Doug lea 在jdk注释中写了这样一段话来解释:该类在多线程更新一个公共的sum(该sum收集统计信息)比AtomicLong 更加高效,而不是应用于细粒度的并发控制。在少量的并发下AtomicLong 与LongAdder 具有相似的性能,但是大量并发下LongAdder更加优秀,但是需要更多的内存。具体使用场景:假设我们使用CurrentHashMap 来统计string 的频率 由于频率值可能会被并发修改 所以可以考虑使用LongAdder.该类继承自Number但是并没有定义equals原创 2021-05-19 18:09:30 · 1132 阅读 · 0 评论 -
ThreadLocal 的理解
ThreadLocal 主要是变量的线程间隔离,即线程本地变量。比如有一个变量 需要在不同的线程中使用,就像各个线程都有各自的一份一样,操作互不影响。其主要操作有set get remove 。set 操作:拿到当前线程对应的ThreadLocalMap 如果为空则需要创建ThreadLocalMap 并初始化一个Entry。如果不为空则需要在ThreadLocal 中找到key为ThreadLocal 的entry 或者未找到的话创建一个新的entry.get 操作可以找到该线程的ThreadLoca原创 2021-05-13 20:57:02 · 97 阅读 · 0 评论 -
synchronized面试总结
java 对象头 有一个部分叫做MarkWord 占32 位或者64位。用来表示对象的状态 倒数第三位为1 且 最后两位为01代表该对象处于可偏向状态。 所以当synchronized 关键字 锁定对象进行同步代码块时,首先检查对象是否可偏向,如果可以则通过cas设置MarkWord 的高位地址为该线程的地址,成功之后 之后该线程再次获取锁对象的时候,检查其高位线程id为自己则直接进入同步代码块。对于轻量级锁 是线程栈帧中生成一个Lock Record (复制锁对象的Mark word + owner 指原创 2021-05-05 15:52:33 · 118 阅读 · 0 评论 -
LockSupport 的理解
Locksupport 理解LockSupport 的构造方法都是私有的。对于创建锁或者其他同步类是基本的线程阻塞原语。LockSupport 与使用它的线程 以及 permit 关联,如果permit 可用的话,park 函数调用使得会立即返回,并消费掉一个permit,否则线程会阻塞。如果之前permit 不可用的时候 即数量为0 的时候,unpark 会使得permit 再次可用,注意与semaphore不同,permit数量不会累积,其数量最多为1 个。park 和unpark用来阻塞或者恢复原创 2021-05-04 17:41:10 · 133 阅读 · 0 评论 -
java 中thread.interrupt 作用
thread.interrupt() 并不是中断该线程,而是告诉该线程该中断了,具体停止线程还是需要被中断的线程来自己控制。比如处于阻塞态的如调用Thread.sleep() object.wait() 或者 Thread.join() Thread.yield() 等处于waited 状态时被中断的时候会InterruptedException异常。interrupt 方法涉及的目的是提示该线程应该终止了,而不是立即终止线程。如果线程处于正常运行状态,如果被中断那么该线程很可能会继续运行下去除非检测线程原创 2021-05-02 18:04:18 · 609 阅读 · 0 评论 -
AQS java并发基石
AQS是java locks 包下的一个基础包,实现了serializable 接口 继承了 AbstractOwnableSynchronizer 。其 重要的类属性有state 代表其状态,Node head tail 代表队列,还有AbstractOwnableSynchronizer 的exclusiveOwnerThread。ReentrantLock的 lock的方法底层就是使用了aqs ,比如Thread 1 和Thread2 同时想要竞争一把锁,即同时想执行 lock方法,则结果是只能有一原创 2021-05-02 17:09:16 · 104 阅读 · 0 评论 -
JDK 1.8ConcurrentHashMap 理解
1.8 currentHashMap不同于1.7 的分段加锁 、分段扩容,1.7虽然也能做到多线程并发的扩容,但是效率不高。1.8currentHashMap 的put操作会对table (key,value)对应的索引位置上的元素检测,如果是空直接cas放置,否则进行加锁操作,这时候就可能是链上的放置 或者树上的放置。完成之后需要对整个currentHashMap 的元素个数加1,这时的操作类似longAdder 来进行多线程下的同步增加个数1,具体原理就是尝试性的进行cas+1操作,如果不成功则利用原创 2021-04-25 16:12:23 · 418 阅读 · 0 评论 -
JDK 1.7ConcurrentHashMap 的理解
CurrentHashMap 中采用分段加锁,扩容操作也是针对某个segment,segment 是继承 Reentrantlock 来实现并发安全的。put操作的逻辑是这样的,首先需要找到Segment数组中的索引来找到该(key,value)应该放到哪个Segment 中,注意segment不存在的时候需要创建,这时候就需要cas 来保证只有一个线程来创建,其他线程使用这个线程创建好的Segment.拿到segment后需要put 到其正确的HashEntry[]数组中的某个位置上,这时候需要进行加锁,原创 2021-04-23 17:55:02 · 211 阅读 · 0 评论 -
Java中的Unsafe 类 概述
使用unsafe类 在juc 包 以及CurrentHashMap 以及Netty 等高性能IO框架中应用广泛。但是对于普通程序员来说应该谨慎使用,防止内存泄漏。1、内存操作unsafe.allocateMemory(long bytes);/*o == null 时 offset 就是绝对偏移量 初始化字节数为 bytes 值为value*/unsafe.setMemory(Object o,long offset,long bytes,byte value);unsafe.freeMemor原创 2021-04-23 14:29:41 · 264 阅读 · 0 评论 -
redis -io多路复用 zset内部结构
ABA问题是当使用乐观锁来进行同步资源控制时,当CAS比较现在的值与预期的值,若相同则改写更新,若不同,则不更新。但是存在一个问题是当另外一个线程修改同步资源假设由A->B->A,那么在判断的时候,就会认为期望值与现在的值相等,那么就会修改。java中使用AtomicStampedReference来解决这个问题。 AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedRe原创 2020-10-13 19:47:08 · 105 阅读 · 0 评论 -
流式编程 函数式接口 枚举类
/** * 5个用户筛选: * ID 为偶数 * 年龄大于=23 * 用户名转化为大写 * 用户名按字母倒排 * 只输出一个用户 * */ public static void main(String[] args) { User u1 = new User(1,"a",22); User u2 = new User(2,"b",23); User u3 = new...原创 2020-10-10 01:25:24 · 386 阅读 · 0 评论 -
Path File URI Resource
Path 通过 normalize toRealPath 来消除 “.” "…"toRealPath 与 toAbsolutePathnormalize 类似Path curDir = Paths.get(".");boolean b = Files.exists(curDir,new LinkOption[]{LinkOption.NOFOLLOW_LINKS});curDir.toAbsolutePath().normalize();System.out.println(curDir.to.原创 2020-06-22 23:42:58 · 164 阅读 · 0 评论 -
URI 我懂了吗
URI 统一资源标识符 [scheme:]scheme-specific-part[#fragment]分为透明URI或者层次化URI透明URI是绝对URI 它的scheme-specific-part 不是开始于’/’,不透明的URI不需要进一步的解析。如下mailto:java-net@java.sun.com news:comp.lang.java urn:isbn:096139210x层次化的URI可以是绝对URI(scheme-specific-part 以’/'开始)或者是.原创 2020-06-22 12:34:21 · 232 阅读 · 0 评论 -
java流式操作
是对集合对象功能的增强,它专注于对集合对象非常便利、高效的聚合操作,或者大批量数据操作,借助于lambda 表达式,提高编程效率和可读性。同时提供串行和并行俩种模式进行操作。在当前大数据爆炸的年代,在数据来源多样化、数据海量化的今天不得不脱离RDBMS,或者以底层返回的数据结构为基础进行上层的数据统计。而java 的集合API中,仅仅有极少的辅助方法,更多时候需要程序员用Iterator来遍历集合,完成相应的聚合逻辑。这是一种不高效的方法在java 7 中如果要发现 type 为grocery的.原创 2020-06-21 21:17:44 · 501 阅读 · 0 评论 -
tymeleaf学习
thymeleaf学习URL:@{}<a th:href="@{/order/{orderId}/details(orderId=${o.id})}">view</a><!--就可转化为href="/order/3/details"-->常量替换无需通过'...'+'...'只需要将包含变量的字符串用|保围<span th:tex...原创 2020-04-07 01:32:43 · 209 阅读 · 0 评论 -
Comparable 和Comparator
Comparator<Person> comp = new Comparator<Person>(){ @override pulbic int compare(Person p1,Person p2){ return p1.age - p2.age; }}**Comparator 和comparable 的区别:在java集合框架中,有Collectio...原创 2019-11-09 13:29:48 · 141 阅读 · 0 评论 -
ArrayDeque
取模运算与位运算的转换**(tail = (tail + 1) & (elements.length - 1)) == head 可以看出tail+1& 1111 tail+1的值始终小于等于15 (assume that elements.length equals 16)相当于取模运算 ** public void addLast(E e) { if ...原创 2019-11-06 17:25:45 · 97 阅读 · 0 评论 -
java 面试1
/*面向对象的基本特征:抽象、继承、多态、封装* 抽象:就是把 现实世界的一类东西,提取出来用代码 表示。1>数据抽象:针对对象的属性2>过程抽象:针对对象的方法行为。* 继承:对象的一个新类可以从现有的类派生,这一过程叫做继承。是为了复用父类代码,并且可以修改或增加方法。同时为实现多态性做准备。* 封装:把过程和数据包围起来,对数据的访问只能通过已定义的界面或借接原创 2017-04-20 14:25:08 · 183 阅读 · 0 评论 -
java核心技术笔记
枚举类型:实际仍为类,继承Enum。继承了许多有用的方法,toString() 静态的values()返回包含全部枚举值的数组。ordinal()返回枚举常量的位置,从0开始。valueOf()返回枚举类实例。与toString 相反。枚举类的构造函数是私有的。反射:可以在运行时根据指定的类名获得类的信息。Class.forName() object.class object.getCl...原创 2019-03-09 23:47:08 · 219 阅读 · 0 评论 -
java基础
对于byte char short int long float double之间的转换,若操作数中有double ,另一个操作数就会转化为double,否则若其中一个操作数为float ,另一个操作数会转化为float,否则若为long,则另一个操作数会转化为long,否则均会转化为int。 double 转int 是直接截断小数部分,将浮点值转化为小数部分。比如9.9转化为int型时为9...原创 2019-03-04 16:21:26 · 136 阅读 · 0 评论 -
Class类 究竟怎么用
Class类 究竟怎么用package learnTest;/* * 我们知道 Java世界是运行在虚拟机之上的,我们的代码 经过编译器 变异之后 生成的是.class 文件。运行期间,我们实例化任何一个类时,jvm 首先会在内存中 * 找有无这个类,若不存在,将这个类加载到内存中,当加载这个类或者是类加载器的define class方法 被调用时,便会为这个类产生一个Class对象,或者说,原创 2017-04-23 23:15:36 · 1273 阅读 · 0 评论 -
最长递减子序列 最简单描述
package someLearn;//写快排的时候犯了个愚蠢的错误 就是 让交换值通过一个函数 来交换,只是Exchange(int i,int j);这种错误还是不犯为好。其实可以写为exchange(int[]A,int i,int j);//问题描述:如何求出一个数列的最长递减子数列的长度 比如输入含有 5 4 3 7 的数组 输出3 这里用动态规划 // F(a[i]) = max原创 2017-05-24 00:42:05 · 1043 阅读 · 0 评论 -
Pattern matcher showMethods
package string;//本篇主要解释了 Pattern 的简单用法 //p=Pattern.compile("regex");//p.matcher(input.toString()).replaceAll(replacement)//"string".replaceAll(regex,replacement)//Matcher 的appendReplacement append原创 2017-05-04 15:17:12 · 211 阅读 · 0 评论 -
cookie session
//cookie 与 session 的区别联系。 //http协议无连接,无状态。而在互联网发展中,客户端和服务端保持连接状态变得必不可少。这就导致俩种技术的出现。cookie session. //现在我们考虑这样一个例子。比如 在你学校有一间你喜欢的理发店,一开始,你是理发一次,现金付一次钱。但是 老板现在推出一种活动,理发5次赠送一次。 //这时候,就需要在你 或者老板 之间有人记录原创 2017-05-11 22:26:06 · 163 阅读 · 0 评论 -
Java 是值传递还是 引用传递?
刚刚在网上看了很多资料,初涉这方面 知识,总结 一下! 若有不妥之处 望指正!其实 在Java中 存在的是 值传递。那你可能会问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案是:值传递。首先不解析这个问题。讲一下基础。对于基本类型:比如int a=4;a是直接放在 栈里面的。其值就为4.对于引用类型:比原创 2017-04-20 17:03:41 · 323 阅读 · 0 评论 -
hashMap了解<一>
package Map;//关于hashMap 的简单总结//刚刚摸清楚赶紧写一下总结。//首先明白任何一个类 都有自己的int hashCode();toString() 方法。因为这是Object 类的方法。你可以选择重写。//有的人对一个对象输出@+一堆数字 实际上是未重写toString 方法。那以一串数字其实就是哈希码。//其实如果取一个对象 需要遍历所有(可能)对象才能取出的话原创 2017-05-03 00:28:10 · 277 阅读 · 0 评论 -
接口 的使用 到底 有什么 益处?完全 解耦( decoupling)
think in java原创 2017-04-20 13:47:55 · 538 阅读 · 0 评论 -
了解 ArrayList 源码(二)
package list;//在ArrayList 源码中有这样的代码/* * private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff int原创 2017-05-01 15:47:35 · 273 阅读 · 0 评论 -
了解 ArrayList 源码(一)
//简单了解ArrayList //extends abstractList implements List<>,RandomAccess, Cloneable, java.io.Serializable //由于实现了List<E> 其实是间接实现了Collection<E>,Iterable<E>这儿可以看出java如何实现多继承。//如果说简单的使用,那么看看ApI 可以。但是了解"背原创 2017-05-01 00:16:17 · 217 阅读 · 0 评论