![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
OneTask
这个作者很懒,什么都没留下…
展开
-
【Java 基础 22】死锁、活锁、线程饥饿的区别
目录死锁死锁产生条件避免死锁线程饥饿活锁死锁两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。死锁产生条件资源互斥 不可剥夺 请求与等待 循环等待避免死锁锁排序 超时放弃线程饥饿一直有优先级更高的线程先获取到锁资源,导致其任务一 直无法进展的一种活性故障。比如高并发的环境下使用非公平(Non-fair)的ReentrantLock就容易出现线程饥饿的情况活锁线程一直处.原创 2020-06-28 22:53:35 · 203 阅读 · 0 评论 -
【Java 基础 21】HashMap、HashTable、ConcurrentHashMap插入新数据,什么时候扩容,怎么扩容(源码分析)
目录HashMapHashTableConcurrentHashMapHashMap插入新数据:检查table是否为null或数据为空(table的初始化发生在第一次put数据时); 计算新数据在table的索引i = (length-1) & hash(key); 判断table索引处是否存在key数据,通过 (k = p.key) == key || (key != null && key.equals(k)); 如果该索引处没有数据,则直接插.原创 2020-06-27 22:56:27 · 520 阅读 · 0 评论 -
【Effective Java 2】Lambda优先于匿名类,方法引用优先于Lambda
匿名类,简单说就是不显式地通过定义类实现接口,直接new接口并实现接口方法得到接口的实例,省去了实现类这一步。public class Test { public static void main(String[] args) { // 匿名类创建接口对象 Fun fun = new Fun() { @Override public int add(int x, int y) {原创 2020-05-27 23:41:46 · 182 阅读 · 0 评论 -
【Effective Java 1】覆盖equals的约定
Object类提供equals方法,所有的类都继承Object类,也继承它的equals方法,判断类的实例是否与另一个实例相等覆盖equals的步骤:1. 使用==操作符检查参数是否为这个对象的引用,如果是,则直接返回true;2. 使用instanceof检查参数是否为正确的类型,如果不是,则直接返回false;3. 经过第二步检查后,确定参数的类型,将参数转换为正确的类型(记住equals的参数是Object类型,在这一步就可以对参数进行类型转换了);4. 对对象的每一个...原创 2020-05-25 22:20:37 · 157 阅读 · 0 评论 -
【深入了解Java虚拟机 第十二章】Java内存模型
目录Java内存模型主内存与工作主存内存之间交互操作原子性、可见性和有序性先行发生原则(Happens-Before)物理计算机中的并发问题由于计算机的存储设备与处理器的运算速度有着几个数据量的差异,现代计算机系统不得不加入一层或者多层读写速度尽可能接近处理器运行速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要的数据复制到缓存中,让处理器运算能够快速开始,运算结束后将结果从缓存中同步刷新回主存,保证处理器运算不需要等待缓慢的内存读写。高速缓存的存在解决了处原创 2020-05-25 20:32:08 · 292 阅读 · 0 评论 -
【深入了解Java虚拟机 第十三章】锁优化-自旋锁和自适应自旋锁、锁消除、锁粗化、轻量级锁和偏向锁
自旋锁【Java 基础 21】Java语言中的线程安全和线程安全的实现方式中提到互斥同步主要面临的问题就是线程阻塞和唤醒带来的性能开销,挂起线程和恢复线程的操作都需要转入内核态完成,这对Java虚拟机的并发性能带来很大的压力,当共享数据的锁定状态只持续很短的一段时间,将其他线程挂起和恢复并不值得,因此虚拟机开发团队设计线程没有获取到锁不立即挂起,而是执行一个忙循环(自旋)等待获取锁。JDK 6之后默认开始自旋锁,可以使用-XX:UsingSpinning参数设置开启/关闭。自旋等待虽然避免了线程原创 2020-05-24 12:19:14 · 369 阅读 · 0 评论 -
【深入理解Java虚拟机 第十一章】后端编译与优化之-逃逸分析
逃逸分析是为其他优化措施提供依据的分析技术一个对象被定义后,做执行范围内,如果被作为参数传递给其他方法,这种叫做方法逃逸;如果运行被其他线程访问,这种称为线程逃逸。对象的逃逸程度:不逃逸->方法逃逸->线程逃逸。针对对象的逃逸程度的优化手段1. 标量替换对象是一个聚合量,由基本数据类型及reference类型等标量(无法继续分解的最小数据)组成。 如果一个对象不逃逸,就可以将对象拆解成基本数据类型及reference类型等标量,程序执行时可能不创建该...原创 2020-05-25 17:56:14 · 304 阅读 · 0 评论 -
【Java 基础 20】Object
package java.lang;import jdk.internal.HotSpotIntrinsicCandidate;public class Object { private static native void registerNatives(); static { registerNatives(); } @HotSpotIntrinsicCandidate public Object() {} //...原创 2020-05-18 18:08:23 · 127 阅读 · 0 评论 -
【Java 基础 19】Exception 和 Error
以下内容来自https://blog.csdn.net/qq_29229567/article/details/80773970?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecaseException 和 ErrorExcep...转载 2020-05-15 08:34:50 · 115 阅读 · 0 评论 -
【Java 基础 18】Java 集合
Java中的集合主要继承Collection和Map两个根接口,Collection又派生了List,Queue,Set三个子接口,因此Java集合主要分为四类:List,Queue,Set,Map List Queue Set 线程安全 非线程安全 线程安全 非线程安全 线程安全 非线程安全 CopyOnWriteArrayList ArrayList ArrayBlockingQueue原创 2020-05-09 19:30:51 · 242 阅读 · 0 评论 -
【深入理解Java虚拟机 第三章】 Java垃圾收集器和内存分配策略
JVM管理的内存中,虚拟机栈、本地方法栈和程序计数器的生命周期和线程的生命周期一致,随着栈帧的出栈实现自动的内存清理,因此JVM中需要GC的内存区域主要在Java堆和方法区。程序所使用的对象和数组填充满Java堆之后,会抛出out of memory异常,程序挂掉,GC机制将不再使用的对象和数组删除,整理内存以便后续使用。GC如何判断对象是否需要被回收需要进行回收的对象的已经不再存活的对象(不再使用),判断对象是否存活的方法有:(1)引用计数(缺点:可能存在循环引用的问题,导致GC无法回收,原创 2020-05-09 18:50:45 · 265 阅读 · 0 评论 -
【深入理解Java虚拟机 第二章】Java内存区域、对象的创建,内存布局和访问定位
Java内存模型Java内存模型(Java Memory Model, JMM)是一种多线程从主存中读写数据操作规范,目的是解决由于多线程通过共享内存进行通信时,存在的缓存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性。我们先看一下下面两个模型的简图:JMM规定每个线程都有自己的工作内存,拷贝一份主存中感兴趣的共享数据的副本,线程对共享变量的操作都是通过和自己的工作内存数据交换进行的,而不是直接读写主存(看,和CPU原创 2020-05-09 18:49:45 · 184 阅读 · 0 评论 -
【Java 基础 14】 NIO
传统IO是面向字节流和字符流进行数据的读写操作,NIO(Non-Blockig IO/ New IO , 非阻塞IO)支持面向缓冲区(Buffer)的、基于通道(Chanel)的IO操作(通道表示打开到IO设备(比如文件、socket)的连接,缓冲区负责存储从文件或网络读写的数据),以更加高效的方式(借助选择器(Selector))进行数据的读写。Bufferjava.nio包提供了除Boolean外7种数据类型的缓冲区ByteBuffer\CharBuffer\ShortBuffer.原创 2020-05-09 18:45:44 · 149 阅读 · 0 评论 -
【深入了解Java虚拟机 第六/七章】 类文件结构和类的加载机制
先举个例子1. 在指定路径下新建一个TestClass.java源文件2. 存放在磁盘的. java源文件 被 javac编译器 编译成 字节码文件.class(注意可能报错编码格式不对,可以指定编码格式:javac -encoding 编码格式 TestClass.java)3. 通过类加载器加载已经编译好的TestClass.class文件URL url = new URL("file:///E:/Projects/project_java/eleven/");ClassLo原创 2020-05-09 18:44:07 · 157 阅读 · 0 评论 -
【Java 基础 12】Atomic
java.util.concurrent.Atomic包下定义了很多具有原子操作的类先看看Atomic包下常用的AtomicInteger类package java.util.concurrent.atomic;import java.lang.invoke.VarHandle;import java.util.function.IntBinaryOperator;import java.util.function.IntUnaryOperator;public class At原创 2020-05-09 01:14:20 · 292 阅读 · 0 评论 -
【Java 基础 11】ThreadLocal
源码package java.lang;import jdk.internal.misc.TerminatingThreadLocal;import java.lang.ref.*;import java.util.Objects;import java.util.concurrent.atomic.AtomicInteger;import java.util.function....原创 2020-05-07 23:19:42 · 363 阅读 · 0 评论 -
【Java 基础 10】CountDownLatch和CyclicBarrier
CountDownLatch源码package java.util.concurrent;import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class CountDownLatch { // 同步锁,继承AQS抽象同步器 private static final class S...原创 2020-05-05 00:34:11 · 120 阅读 · 0 评论 -
【Java 基础 9】单例模式及其设计方法、DCL、破坏单例模式方法以及防破坏手段
单例模式一个类只允许创建一个实例单例模式应用场景1. 外部资源,配置文件等,比如打印2. 数据库连接池3. 计数器4. 日志工具5. 等Java中单例模式体现1. Runtime2. spring IOC容器3. 等单例模式的优点1. 由于在进程中只存在一个对象,当需要频繁创建和销毁的对象时,单例模式无疑可以节约系统资源,提高系...原创 2020-05-04 01:15:16 · 176 阅读 · 0 评论 -
【Java 基础8】volatile 关键字
JMM中的可见性问题在多线程环境中,共享变量A(存储在主存)在每个线程的工作内存中有一份拷贝Bi,线程直接读写工作内存中的数据,不同的线程的工作内存中变量之间不可见,这样就可能存在一个问题:工作内存Bi与主内存A同步延迟现象带来的可见性问题Volatile修饰的变量特点1. 多线程之间缓存可见2. 禁止指令重排,保证数据的有序性/一致性Volatile 缓存可见性(...原创 2020-05-02 00:03:40 · 254 阅读 · 0 评论 -
【Spring boot篇 1】AOP
AOPAspect-Oriented Programming, 面向切面编程,基于横向抽取机制将公共的非业务逻辑代码抽取出来封装为切面类AOP的好处业务逻辑和非业务逻辑分离,便于维护和升级业务模块更简洁切入点(Pointcut)AOP通过切入点作用于连接点连接点(Joinpoint)AOP作用的位置,包括方法执行前、执行后、捕获异常后、正常返...原创 2020-04-27 21:26:32 · 299 阅读 · 0 评论 -
【Java 基础7】CAS以及CAS典型的ABA问题
CASCompare and swap,比较和替换,通过利用CPU的CAS指令对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。实现过程,线程想将内存值V修改为新值U,线程内部有一个V的预期值E,当且仅E和V相等时,才将V修改为U,否则不进行操作。ABA问题在线程T1修改var之前,线程T2将var=A修改为var=B,又将var=B修改为var=A,线程T1不能感知到...原创 2020-04-25 22:53:55 · 136 阅读 · 0 评论 -
【Java 基础 6】锁-sychronized和Lock
sychronizedJava内置锁,基于Montier实现,通过moniterenter进入和moniterexit退出实现方法和代码块的同步,Montier依赖于操作系统底层的MutexLock(互斥锁)实现作用方式普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类class对象的锁...原创 2020-04-23 22:41:33 · 374 阅读 · 0 评论 -
【并发编程+数据库】模拟多个用户短时间内向服务器提交申请
场景:1. 用户申请注册,向服务器发送注册所需信息,服务器将新注册用户信息存入数据库指定表中;2. 将客户端向服务器提交的注册所需数据封装为类对象,客户端向服务端发送Data对象,3. 非阻塞模式下,用户连接服务器失败不会进入阻塞等待而会被直接失效,设置5秒的阈值时间,在该时间内连接失败则重新连接,超出时间仍未连接成功,则抛弃该任务,提示“服务器繁忙,请稍后再试”;实现:...原创 2020-04-04 21:34:05 · 588 阅读 · 0 评论 -
【Java 基础 5】注解
Java内置的注解Java 定义4个元注解(描述注解的注解,在java.lang.Annotation包中)和3个常用的注解(在java.lang包中)元注解@Retention - 描述注解的保留策略 @Retention(RetentionPolicy.SOURCE) //注解保留到Source阶段 @Retention(RetentionPolicy.C...转载 2020-03-25 21:08:25 · 123 阅读 · 0 评论 -
【Java 基础 4】反射机制
Java中反射机制Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。简单来说,反射机制就是将类的各个组成部分(成员变量,构造器,成员方法)一起封装为Class对象。反射被视为动态语言的...转载 2020-03-25 11:17:39 · 164 阅读 · 0 评论 -
【数据库篇1】MySQL数据库增删查改操作
写在前面:本篇主要记录一下啊数据库的常规操作先给出增删查改等的sql语句查询表manage是否存在strsql = " show tables likemanage ";新建表【manage, 包含三个字段name, age, sex】strsql = "create table manage(name varchar(20) not null, age int(4) n...原创 2020-03-24 17:49:45 · 273 阅读 · 0 评论 -
【笔试】2020年3月22号远景智能笔试
1. 字符串相似率原创 2020-03-22 23:17:08 · 687 阅读 · 0 评论 -
【笔试】2020年3月20号阿里笔试
输入10个int表示10种牌个数,可以打单牌(1),对子(11),顺子(12345), 连对(112233),求最少几次可以打完所有牌(笔试时只通过了10%,现在重新编写将输出出牌次数改成输出出牌情况,方便大家理解以及帮助我纠错,注意:只经过我自己的测试,不一定能ac)public static void main(String[] args) { //10种牌,输入每种牌的张...原创 2020-03-21 23:41:48 · 2820 阅读 · 0 评论 -
【Java 基础3】接口 和 抽象类 的联系和区别(下)
写在前面:接【Java 基础3】接口 和 抽象类的联系与区别(上)抽象类抽象类更多的被理解为不同事物(对象)的概念, 比如三角形,四边形,五边形...它们由不同的类实例化,但是它们都有共同的特征比如边,顶点等属性和求面积,求周长等动作,然而不同的形状求面积,求周长的方式不同,那怎么办呢?开发人员每需要定义一种新的形状时,就定义一个新的类,在小的demo项目中倒没什么不妥,但是实际的...原创 2020-03-10 17:45:57 · 228 阅读 · 0 评论 -
【Java 基础3】接口 和 抽象类的联系与区别(上)
写在前面:多敲代码就会记住抽象类和接口有各自最显著的特点就是前者被abstract修饰,后者被interface修饰原创 2020-03-09 23:25:49 · 169 阅读 · 0 评论 -
【Java 基础2】JDK,JRE和JVM的区别与联系有哪些?
写在前面知其然还得知其所以然JDK: Java Development KitJava开发套件,是java开发的核心,包括提供编译、调试和运行Java程序的所有工具和JREJRE: Java Runtime EnvironmentJava运行时环境,包括 Java标准实现,Java核心类库和JVMJVM: Java Virtual MachineJava虚拟机,模拟计算...原创 2020-03-07 22:04:00 · 132 阅读 · 0 评论 -
【Java 基础1】 面向对象的三大核心特性:封装、继承、多态
写在前面基础知识往往在面试容易忘记和卡壳对象Java是面向对象的编程语言,我理解的面向对象编程是通过对象来完成数据传递、分析、实现特定功能;最常见的,定义一个class Staff ,具有一些特定的属性(成员变量)比如年龄age、性别gender 和行为(成员函数)比如上班onWork()、下班offWork(),那么Staff 就可以是职员的抽象描述;程序员new一个Staf...原创 2020-03-07 21:26:44 · 365 阅读 · 0 评论 -
理解线程池以及四种典型线程池(Java)
写在前面看大神的学习视频后,想给大家整理一下指路大神:https://www.bilibili.com/video/av88030891?p=4为什么要用线程池?我的上一篇文章JVM使用的什么线程模型(Java)里提到了,JVM使用的是KLT线程,当任务提交进来,需要等线程创建才能执行,执行完毕后,线程会被内核自动销毁。当任务小而体量大时,大量的创建和销毁造成资源浪费,因此,可以借...原创 2020-03-06 21:38:47 · 208 阅读 · 0 评论 -
线程模型、线程状态、线程调度
写在前面学习线程池的时候看到大神这样解释JVM使用的什么线程模型,觉得很好记,特作此笔记指路大神:https://www.bilibili.com/video/av88030891?from=search&seid=17492535771058836299答案: 内核线程(KLT)线程模型首先我们要知道有什么线程模型目前我们接触到的两种线程模型:1. 用户级线程(...原创 2020-03-06 14:38:31 · 488 阅读 · 0 评论 -
《贪吃蛇》从游戏中学习虚拟摇杆、TCP通信、单例模式等的应用(Java实现,Java和C#通信)
这个小游戏中主要介绍:1. 一个比较经典好玩易实现的虚拟摇杆的创建和使用;2. 使用链表实现蛇的增长和移动,代替数组实现,避免初始化蛇角色时分配空间带来的麻烦;3. 之前发过一篇socket通信的帖子,顺手移植到这个小游戏中玩一下;4. 如何使用单例模式在整个工程中传递一个且只能存在一个的对象;5. 接口怎么用;6. ........先看一下效果:...原创 2019-05-22 12:05:03 · 636 阅读 · 1 评论