
JavaSE
文章平均质量分 92
Geek_ymv
公众号 geekymv
展开
-
tcpdump排查线上接口请求问题
新上线的服务出问题了,调用第三方的接口出现服务端响应状态码401,赶紧查询 HTTP Code 401代表啥意思,于是找到了这篇文章 http常见的状态码,400,401,403状态码分别代表什么?401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息401是服务端响应的状态码,根据接口文档在请求header中添加 X_API_KEY用于接口验证,代码中也确实这么实现的。而且同样的接口本地发送请求没有问题,这里是使用Hutool(3.3.2版本)工具包发送HTTP请原创 2021-10-16 17:18:16 · 626 阅读 · 0 评论 -
【JVM】谈谈JVM内存区域的划分
对 Java 程序员来说我们不用自己手动管理对象内存的申请与释放,全部交由 Java 虚拟机(JVM)来管理内存的分配与回收。因此,日常开发中我们不用关心内存分配与回收,减少了很多繁琐的工作,大大提高了开发效率。也正是因为如此,一旦出内存泄漏和溢出方面的问题,如果不了解 JVM 内部的内存结构、工作机制,那么排查问题将变得异常艰难。接下来,我们一起学习 JVM 内存区域的划分、作用以及可能产生的问题。根据 Java 虚拟机规范,Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为几原创 2021-05-27 14:29:00 · 615 阅读 · 0 评论 -
从源码层面理解 ArrayList 扩容策略
ArrayList 在我们日常开发中用到的非常多,我们知道 ArrayList 内部是通过 Object 数组实现的,而数组的长度一经定义,就无法更改了。那么问题就来了,ArrayList 是如何实现扩容的呢?我们先来看看 ArrayList 类中有哪些成员变量。ArrayList 的成员变量/** * Default initial capacity. * 默认的初始容量10。 */private static final int DEFAULT_CAPACITY = 10;/**原创 2021-01-01 19:54:46 · 320 阅读 · 3 评论 -
并发编程的挑战
并发编程目的及挑战并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果我们希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换问题、死锁问题,以及受限于硬件和软件的资源限制问题。上下文切换单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。CPU时间片是CPU分配给各个线程的执行时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般几十毫秒原创 2020-06-20 00:30:30 · 202 阅读 · 0 评论 -
聊聊Java中的Thread类
Thread类是位于java.lang包下,java.lang包是系统自动隐式导入的,也就是说开发人员无需用import语句导入就可以使用其中的类。thread是程序中的执行线程,Java虚拟机允许应用程序具有多个并发运行的执行线程。每个线程都有一个优先级,优先级高的线程比优先级低的线程优先执行。每个线程可能会也可能不会被标记为守护(daemon)线程。当某些线程(比如线程A)中运行的代码创建新的Thread对象(线程B)时,新线程(线程B)的优先级被设置为等于创建线程(线程A)的优先级。并且当且仅当创原创 2020-06-10 13:27:34 · 994 阅读 · 0 评论 -
自旋在synchronized底层实现性能提升
JVM的同步是基于进入与退出监视器对象(管程对象)(Monitor)来实现的,每个对象实例都会有一个Monitor对象,Monitor对象会和Java对象一同创建和销毁。Monitor对象是由C++来实现的。当多个线程同时访问一段同步代码时,这些线程会被放到一个EntryList集合中,处于阻塞状态的线程都会被放到该列表中。接下来当线程获取到对象的Monitor时,Monitor依赖于底层操作系统的mutex lock来实现互斥的,线程获取mutex成功,则会持有该mutex,这时其他线程就无法再获取到该原创 2020-06-10 00:20:18 · 267 阅读 · 0 评论 -
聊聊Java中的wait、notify及notifyAll方法
聊聊Java中的wait、notify及notifyAll方法wait方法会导致当前线程等待直到其他线程调用这个对象的notify()方法或者notifyAll()方法,或者到达了指定的时间。当前线程必须拥有这个对象的锁。这个方法造成当前线程(叫做T)将它自己放入这个对象的等待集合,然后放弃任何虚假唤醒关于wait与notify和notifyAll方法的总结:1.当调用wait时,首先需要确保调用了wait方法的线程已经持有了对象锁;2.当调用wait后,该线程就会释放掉这个对象锁,然后进入到原创 2020-05-27 23:19:02 · 316 阅读 · 0 评论 -
Java中Integer类有坑吗
一切皆对象?我们知道Java是一门面向对象的编程语言,但是原始数据类型(boolean、byte、short、char、int、float、double、long)并不是对象。Integer 是int 对应的包装类,它内部包含一个int 类型的成员变量存储数据。 /** * The value of the {@code Integer}. * * @serial */ private final int value;Integer 类提供了基原创 2020-05-16 10:26:50 · 553 阅读 · 0 评论 -
synchronized 和 Lock 有什么区别?用新的lock有什么好处?
原始构成synchronized 是关键字属于JVM层面,monitorenter、monitorexit 底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象,只有在同步块或方法中才能调用wait/notify等方法)。Lock 是具体类(java.util.concurrent.locks.Lock),是API层面的锁。...原创 2020-04-07 21:44:51 · 281 阅读 · 0 评论 -
生产者消费者模式
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 线程操作资源类 * 判断、干活、通知 * 防止虚假唤醒通知 */class ShareData { ...原创 2020-04-07 21:18:47 · 227 阅读 · 0 评论 -
阻塞队列 BlockingQueue
ArrayBlockingQueue 由数组结构组成的有界阻塞队列。LinkedBlockingQueue 由链表结构组成的有界(大小默认值为Integer.MAX_VALUE)阻塞队列。PriorityBlockingQueue 支持优先级排序的无界阻塞队列。DelayQueue 使用优先级队列实现的延迟无界组织队列。SynchronousQueue 不存储元素的阻塞队列,也即单个元素...原创 2020-04-07 19:56:44 · 283 阅读 · 0 评论 -
互联网面试题之CountDownLatch/CyclicBarrier/Semaphore用过吗
CountDownLatchimport java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;/** * 秦灭六国,一统天下 */public class CountDownLatchDemo { public static final int NUM = 6; publ...原创 2020-03-22 20:58:18 · 272 阅读 · 0 评论 -
互联网面试题之Java锁
公平锁、非公平锁公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队,先来后到。非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。在高并发的情况下,有可能会造成优先级反转或者饥饿现象。在Java并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁。 ...原创 2020-02-22 21:27:53 · 261 阅读 · 0 评论 -
互联网面试题之集合类不安全的并发修改异常
ArrayList 异常 java.util.ConcurrentModificationException原创 2020-02-22 15:47:17 · 288 阅读 · 0 评论 -
互联网面试题之CAS的ABA问题
ABA 问题是怎么产生的CAS 算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差里会导致数据的变化。比如说一个线程T1从内存位置V中取出A,这个时候另一个线程T2也从内存中取出A,并且线程T2进行了一些操作将值变成了B,然后线程T2又将V位置的数据变成A,这时候线程T1进行CAS操作发现内存中仍然是A,然后线程T1操作成功。...原创 2020-02-18 16:50:34 · 331 阅读 · 0 评论 -
互联网面试题之CAS你知道吗
CAS (compare and swap) 比较并交换AtomicInteger ai = new AtomicInteger(0);int i = ai.getAndIncrement();getAndIncrement() 源码/*** Atomically increments by one the current value.** @return the previou...原创 2020-02-17 19:46:23 · 432 阅读 · 2 评论 -
Java类加载器与双亲委派模型
类的加载类的加载最终产品是位于内存中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载器并不需要等到某个类被首次主动使用时再加载它。JVM 规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序主动使用该类时才报告错误(Linka...原创 2019-11-11 22:10:04 · 197 阅读 · 0 评论 -
从虚拟机层面看Java 中的数组
通过前面章节Java虚拟机类的加载时机的学习,我们知道new 一个类的时候如果这个类还没有初始化就会触发这个类的初始化。那么我们new 一个数组的时候会不会触发类的初始化呢?通过运行下面这个示例,我们可以看到MyTest类的静态代码块并没有执行,说明并没有触发MyTest类的初始化阶段。package com.geekymv.test.jvm;public class Test03Array...原创 2019-10-24 22:21:46 · 321 阅读 · 1 评论 -
Java并发/多线程指南
在过去,计算机只有一个CPU,并且同一时刻只能执行一个程序。后来出现了多任务处理,这意味着计算机可以同时执行多个程序(AKA任务或进程)。然而,它并非真正“在同一时间”。单个CPU在程序之间共享。操作系统将在运行的程序之间切换,在切换之前执行每个程序一段时间。随着多任务处理出现,软件开发人员面临着新的挑战。程序可能不在假设拥有所有可用的CPU时间,也不能假设所有内存或其他计算机资源。一个好的程...翻译 2018-10-01 15:40:36 · 265 阅读 · 0 评论 -
Java类加载机制
1. 类的加载过程:加载:查找并加载类的二进制数据,将类的class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象用来封装类在方法区内的数据结构连接- 验证:确保被加载的类的正确性- 准备:为类的静态变量分配内存,并将其初始化为默认值- 解析:把类的符号引号转换为直接引用初始化:为类的原创 2017-08-13 22:20:49 · 309 阅读 · 0 评论 -
乐观锁与悲观锁——解决并发问题
乐观锁与悲观锁——解决并发问题转载 2017-01-20 11:14:41 · 720 阅读 · 0 评论 -
Java字节码技术
Reading compiled Java bytecode can be tedious, even for experienced Java developers.即使对于经验丰富的Java开发人员来说,阅读编译后的Java字节码也可能很乏味。Why do we need to know about such low-level stuff in the first place?首先,我...翻译 2019-05-22 23:31:37 · 854 阅读 · 0 评论 -
Java中类的主动使用举例
Java中类的主动使用举例在上一节中,我们知道Java程序对类对使用方式有两种:主动使用和被动使用。其中Java程序对类的主动使用有5种情况,其余情况均为被动使用。下面我们通过一个例子来看看主动使用:public class Test01ClassInit { public static void main(String[] args) { System.out....原创 2019-08-07 23:57:47 · 320 阅读 · 0 评论 -
Java虚拟机类的加载时机
类加载机制Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被直接使用对Java类型。在Java语言中,类型(class)的加载、连接与初始化过程都是在程序运行期间完成的,通过这种方式提供了更大的灵活性,增加了更多的可能性。Java里天生支持的动态扩展对语言特性就是依赖运行期动态加载和动态连接这个特点实现的。例如,如果编写一个面向接口的应用程...原创 2019-08-06 23:25:49 · 222 阅读 · 0 评论 -
Java进阶书籍推荐,你读过几本?
1.《Effective Java中文版(原书第3版)》Google首席Java架构师倾情力作,这本书涵盖Java 7、Java 8和Java 9中语言和库的各种新特性,可以深入了解Java平台的细微之处。个人觉得这本书并不适合入门的小白看,如果有一些Java开发经验之后,再看这本书的话,才会受益匪浅。2.《Java并发编程实战》Java并发经典书籍,书中采用循序渐进的讲解方式...原创 2019-08-14 22:57:37 · 408 阅读 · 0 评论 -
从一道面试题来理解类变量两次赋初始值过程
从一道面试题来理解静态变量两次赋初始值过程根据前面文章,我们知道在类的加载过程有两次赋初始值的过程。一次赋值在准备阶段,为类的静态变量(类变量)分配内存,并将其初始化为默认值,另一次赋值是在初始化阶段,为类的静态变量赋予程序员定义的初始值。即使在初始化阶段程序员没有为类的静态变量赋初始值也没关系,类变量仍然具有一个确定的初始值。比如下面这个实例:public class TestStatic...原创 2019-08-12 23:29:06 · 456 阅读 · 0 评论 -
从虚拟机层面看Java 中的常量
编译期常量我们知道在Java中,在类中通过static final 修饰的变量在程序运行过程中是不能够改变的,我们称之为常量。常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,从而也不会导致定义常量的类的初始化。我们看下面这个示例:public class Test02ConstClass { public static void main(String[] ...原创 2019-10-21 22:47:09 · 309 阅读 · 0 评论 -
java 防止 XSS 攻击的常用方法总结
参考博客http://ju.outofmemory.cn/entry/54043http://www.yihaomen.com/article/java/409.htmimport java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.List;i原创 2016-12-21 21:39:13 · 799 阅读 · 0 评论 -
Quartz2.2.1集成Spring
import java.text.SimpleDateFormat;import java.util.Date;public class MyJob { public String hello() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = sdf.for原创 2016-12-21 21:27:45 · 410 阅读 · 0 评论 -
Hello Quartz
import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.Job;import org.quartz.JobDetail;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;public c原创 2016-12-21 21:22:23 · 385 阅读 · 0 评论 -
统计随机数的个数
/* 随机生成50个整数,每个数字的范围是[10,50],统计每个数字出现的次数以及 * 出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来。如果 * 某个数字出现的次数为0,则不要打印它. * java.lang.Math;-----random();方法 * * java.util.Random; * * */public class Numb原创 2013-01-06 20:22:06 · 1287 阅读 · 0 评论 -
统计字符串中每个字母出现的次数
/* * 需求:统计字符串中每个字母: * 说明:编写程序,提示用户输入一个字符串, * 然后统计字符串中每个字母出现的个数,忽略字母的大小写。 * * 原理: * 1.使用String类中的toLowerCase()方法,将字符串中的大写字母转换成小写形式。 * 2.构造一个具有26个int值得数组ch ,每个元素记录一个字母出现的次数。 * 即,ch[0]记录a的个数,c...原创 2012-12-16 22:56:00 · 10402 阅读 · 0 评论 -
简单乘法表
/*打印乘法表:*/import java.util.*;public class MultipliDemo{ public static void main(String[] args) { System.out.println("请输入整数num:"); int num = new Scanner(System.in).nextInt(); System.out.原创 2012-12-28 18:04:50 · 615 阅读 · 0 评论 -
Java猜拳小游戏
import java.util.*;public class GuessDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("-----猜拳游戏-----"); System.out.print原创 2012-12-28 16:12:50 · 1285 阅读 · 0 评论 -
成绩处理
/* * 需求:成绩处理 * 说明:输入学生的姓名和分数,按分数从高到低排序。 * * */package P0;import java.util.*;public class ScoreDemo { public static void main(String[] args) { // TODO Auto-generated method st原创 2012-12-13 21:54:12 · 512 阅读 · 0 评论 -
复制图片
/* * 复制一个图片:将C盘下的一个图片拷贝到D盘。 * * 步骤: * 1.用字节读取流对象关联一个图片; * 2.用字节写入流对象创建一个图片文件,用于存储获取到的图片数据; * 3.通过循环读写,完成数据的存储; * 4.关闭资源。 * * */package P19;import java.io.*;public class CopyPic { /**原创 2012-12-11 19:21:40 · 604 阅读 · 0 评论 -
String类中常用方法总结
/*String类:用于描述字符串事物提供了多个方法对字符串进行操作。"adnhjjj"字符从0开始计数。单引号表示字符,双引号表示字符串 常见方法:1.获取: a.字符串包含的字符数,即字符串长度: int length();获取长度。 b.根据位置获取位置上的某个字符: char charAt(int index);获取字符 c.根据字符原创 2012-11-22 23:22:50 · 657 阅读 · 0 评论 -
文件拷贝功能(二)
/* * 通过缓冲区复制一个文件: * */import java.io.*;public class CopyTextByBuf { /** * @param args * @throws IOException */ public static void main(String[] args){ // TODO Auto-generat原创 2012-12-08 20:05:33 · 652 阅读 · 0 评论 -
文件拷贝功能的实现
/*将C盘的一个文件复制到D盘。 * * 复制原理: * 将C盘下的文件数据存储到D盘的一个文件夹。 * * 步骤: * 1.在C盘下创建一个文件,用于存储D盘文件中的数据; * 2.定义读取流和C盘文 件关联; * 3.通过不断的读写完成数据存储; * 4.关闭资源。 * * */package P18;import java.io.*;public cl原创 2012-12-08 10:27:35 · 858 阅读 · 0 评论 -
this用法举例——树叶Leaf
/*程序头部注释开始文件名称:ThisTest.java作者:Geek_ymv完成日期:2012年12月19日版本号:x1.0对任务及求解方法的描述部分输入描述:问题描述:this用法this:表示的是当前对象本身,更确切的说,this代表了当前对象的一个引用。对象的引用:对象的另一个名字。通过引用可以顺利的访问到对象,包括访问、修改对象的域、调原创 2012-11-19 22:21:31 · 834 阅读 · 0 评论