![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 76
JavaSE
B哥正在
这个作者很懒,什么都没留下…
展开
-
Synchronized与ReentrantLock区别总结
相似点这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善)。功能区别这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,转载 2021-08-30 10:54:13 · 301 阅读 · 0 评论 -
什么是 CAS ?
我们先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次。最终输出的count结果一定是200吗?因为这段代码是非线程安全的,所以最终的自增结果很可能会小于200。我们再加上synchronized同步锁,再来看一下。加了同步锁之后,count自增的操作变成了原子性操作,所以最终输出一定是count=200,代码实现了线程安全。虽然synchronized确保了线程安全,但是在某些情况下,这并不是一个最有的选择。关键在于性能问题。synchronized关键字会让没有得到转载 2021-08-23 15:07:33 · 196 阅读 · 1 评论 -
创建线程的几种方式
Java中创建线程主要有三种方式:一、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。public class FirstThreadTest extends Thread { int i = 0; //重写run方法,run方法的方法体就是现场执行体转载 2021-08-23 09:46:48 · 17727 阅读 · 1 评论 -
开发环境搭建文档
云管部署文档v1.1 2021-07-12一. 安装JDK1. 查看系统是否携带OpenJDK, 是则卸载1.1 查看java 版本[root@CSSMP /]java -version# 2. 如果是以下这种结果, 则携带openjdk version "1.8.0_262"OpenJDK Runtime Environment (build 1.8.0_262-b10)OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)原创 2021-07-28 14:23:10 · 447 阅读 · 0 评论 -
如何理解JVM的强、软、弱、虚引用?
整体架构强引用强引用是默认支持,当内存不足的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会回收对象。强引用是最常见的普通对象引用,只要还有强引用指向对象,对象就存活,垃圾回收器不会处理存活对象。一般把一个对象赋给一个引用变量,这个引用变量就是强引用。当一个对象被强引用变量所引用,它就处于可达状态,是不会被垃圾回收的,即使之后都不会再用到了,也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。对于一个普通对象,如果没有其他引用关系,只要超过了引用的作用域或者显式地将相应转载 2021-08-19 09:44:56 · 97 阅读 · 0 评论 -
Java 逃逸分析
引入记得几年前有一次栈长去面试,问到了这么一个问题:Java中的对象都是在堆中分配吗?说明为什么!当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在考什么知识点,难道对象不是在堆中分配吗?最后就没然后了,回去等通知了。。这个面试题很经典,我最近也分享到了知识星球上面:什么是逃逸分析什么是逃逸分析?关于 Java 逃逸分析的定义:逃逸分析(Escape Analysis)简单来讲就是,Java Hotspot 虚拟机可以分析新创建对象的使用范围,并决定是否在 Java 堆上分配转载 2021-08-09 16:46:41 · 298 阅读 · 0 评论 -
JAVA8 之 StringJoiner
前几天偶然看到jdk1.8突然新增了一个类StringJoiner , 就研究了一下是怎么使用的,作用:运用了StringBuilder的一个拼接字符串的封装处理1. StringJoiner 基本使用(1) StringBuffer 拼接字符串StringBuilder sb = new StringBuilder();sb.append("hello");sb.append(",");sb.append("world");sb.append(",");sb.append("J转载 2021-08-09 15:33:00 · 294 阅读 · 0 评论 -
java异常:(实例分析)try-catch-finally 中哪个部分可以省略?如果 catch 中 return 了,finally 还会执行吗?return的执行顺序?
1. try-catch-finally 中哪个部分可以省略?以下三种情况都是可以的:try-catchtry-finallytry-catch-finally可以省略catch或者finally。catch和finally不可以同时省略。2. 如果 catch 中 return 了,finally 还会执行吗?答案:会。(1)finally的作用就是,无论出现什么状况,finally里的代码一定会被执行。(2)如果在catch中return了,也会在return之前,先执行finally转载 2021-08-09 14:01:56 · 3791 阅读 · 0 评论 -
20 个实例轻松玩转 Java 8 Stream
引入先贴上几个案例,水平高超的同学可以挑战一下:从员工集合中筛选出salary大于8000的员工,并放置到新的集合里。统计员工的最高薪资、平均薪资、薪资之和。将员工按薪资从高到低排序,同样薪资者年龄小者在前。将员工按性别分类,将员工按性别和地区分类,将员工按薪资是否高于8000分为两部分。用传统的迭代处理也不是很难,但代码就显得冗余了,跟Stream相比高下立判。一. Stream 概述Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给转载 2021-08-05 17:11:31 · 56 阅读 · 0 评论 -
Colletions 的 emptyList( ) 和 EMPTY_LIST的区别
1.场景需求我们在开发时,某个方法返回的结果集可能不存在,可能会返回null,为了避免在调用这个方法时做null判断,我们往往会在方法返回结果为null时返回一个空集合,return new ArrayList<T> resultList这样固然可以,但是每次我们new 一个集合对象的时候都会有一个初始化空间,占用内存资源,积少成多会浪费很多的资源,这时候我们就可以使用Collections的emptyList( ) 方法或者EMPTY_LIST。Collections中的空集合对象是转载 2021-07-28 15:08:12 · 227 阅读 · 0 评论 -
Java中如何对汉字进行字典序排序
场景需求需要给前端返回一个有序的集合,且用来排序的字段包括中文汉字Collator类介绍公共抽象类Collatorextends Object实现了Comparator < Object >,CloneableCollator类用于执行区分语言环境 String比较。您可以使用此类为自然语言文本构建搜索和排序例程。Collator是一个抽象基类。子类实现特定的整理策略。一个子类 , RuleBasedCollator当前随 Java 平台一起提供,并且适用于多种语言。可以创建其原创 2021-07-28 14:37:19 · 3095 阅读 · 0 评论 -
Java对象-深拷贝(实现Serializable, Cloneable两种方式)
一. 使用序列化流实现方法实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。实体类 Schoolpackage entity;import java.io.*;import java.util.List;public class School implements Serializable { private List<Student> students; private String sclNo; p原创 2021-06-21 16:08:02 · 1155 阅读 · 2 评论 -
Java理解误区——方法的重载是多态性的一种体现?
理解误区面试题 :“方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。”方法的重载是多态性的一种体现吗? 其实这是一个误区,让我很长的一段时间都理解错了,直到转载 2021-06-21 11:51:21 · 2843 阅读 · 0 评论 -
理解和正确使用Java中的断言(assert)
一、语法形式:Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的语法形式有如下所示的两种形式:(1)assert [boolean 表达式]如果[boolean表达式]为true,则程序继续执行。如果为false,则程序抛出AssertionError,并终止执行。(2)assert[boolean 表达式 : 错误表达式 (日志)]如果[boolean表达式]为true,则程序继续执行。如果为false,则程序抛出java.l转载 2021-06-21 09:49:04 · 1146 阅读 · 0 评论 -
为什么volatile只能保证有序性不能保证原子性
摘自: https://www.cnblogs.com/simpleDi/p/11517150.html对于内存模型的三大特性:有序性、原子性、可见性。大家都知道volatile能保证可见性和有序性但是不能保证原子性,但是为什么呢?一、原子性、有序性、可见性1、原子性:(1)原子的意思代表着——“不可分”;(2)在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。原子性是拒绝多线程交叉操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。例如 a=1是原子性转载 2021-06-18 15:42:13 · 295 阅读 · 0 评论 -
Comparable 接口和 Comparator 接口的区别
1. Comparator 和 Comparable 相同的地方他们都是java的一个接口, 并且是用来对自定义的实体类比较大小的,当我们有这么一个personList,里面包含了 person1, person2, persion3…, 我们用Collections.sort( personList ), 是得不到预期的结果的. 这时肯定有人要问, 那为什么可以排序一个字符串list呢:如 StringList {“hello1” , “hello3” , “hello2”}, Collection原创 2021-06-09 09:48:13 · 1946 阅读 · 0 评论 -
Comparable 接口的使用
接口 Comparable此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。方法详细信息compareToint compareTo(T o)比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整原创 2021-06-09 09:25:48 · 4553 阅读 · 0 评论 -
浅析 AutoCloseable 接口
一. AutoCloseable接口由来从AutoCloseable的注释可知它的出现是为了更好的管理资源,准确说是资源的释放,当一个资源类实现了该接口close方法,在使用 try-catch-resources 语法创建的资源抛出异常后,JVM会自动调用close 方法进行资源释放,当没有抛出异常正常退出try-block时候也会调用close方法。像数据库链接类Connection,io类InputStream或OutputStream都直接或者间接实现了该接口。二. 认识 AutoCloseab原创 2021-06-09 08:57:38 · 239 阅读 · 0 评论 -
Java mutable 和 immutable 类型
含义immutable : variables that are assigned once and never reassigned.mutable : When you assign to a variable or a field, you’re changing where the variable’s arrow points. You can point it to a different value. When you assign to the contents of a mutable原创 2021-05-31 16:09:51 · 205 阅读 · 0 评论