Java
文章平均质量分 69
gclhaha
对未来的恐惧
展开
-
Go与Java泛型原理简介
本人从毕业后从事Java开发工作,大概从2021年下半年开始体验和学习Go语言前几个月Go 1.18实现了泛型,好奇具体实现之余,发现Java的泛型原理自己也不明白,前段时间查阅了一下,还是想记录下来,就有了这篇博客泛型函数被修改成只接受指针作为参数的方式。然后,这些值被分配到堆上,这些值的指针被传递给泛型函数。这样做是因为指针看起来总是一样的,不管它指向的是什么类型。如果这些值是对象,该函数只有一个指向对象的指针,不知道它们的方法在哪里。因此,它需要一个可以查询方法的内存地址的表格:Virtual M原创 2022-06-27 19:41:58 · 585 阅读 · 1 评论 -
Java的IO机制
BIO在IO时是阻塞状态,优点是代码简单、直观,缺点是IO的效率和可扩展性瓶颈。NIO发送请求后不阻塞NIO的核心NIO-ChannelsNIO-BuffersNIO-Selector允许单线程处理多个Channel,如果一个线程有多个连接,每个连接流量很低,此时用Selector就很方便,例如聊天服务器。Selector有一个public abstract SelectorProvider provider();方法,方法的实现是这样的 public static S原创 2020-09-09 00:25:07 · 104 阅读 · 0 评论 -
JUC梳理
JUC包的分类并发工具类CountDownLatchDemopublic class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { new CountDownLatchDemo().go(); } private void go() throws InterruptedException { CountD原创 2020-09-06 13:23:43 · 181 阅读 · 0 评论 -
Map之HashMap、ConcurrentHashMap
HashMapConcurrentHashMap原创 2020-09-06 12:04:18 · 93 阅读 · 0 评论 -
Java异常体系
Error和Exception的区别原创 2020-09-06 11:00:04 · 75 阅读 · 0 评论 -
Java线程池
java8的并行流也使用了work-stealing算法。为什么使用线程池降低资源消耗提高线程的可管理性原创 2020-09-04 00:05:39 · 59 阅读 · 0 评论 -
CAS(Compare and swap)
一种高效实现线程安全性的方法CAS思想public class CASCase { public volatile int value; public void add(){ value++; }}终端输入命令javac CASCase.java生成class文件,然后javap -verbose CASCase.class查看汇编代码public class com.gclhaha.javabasic.jvm.thread.CASCase min原创 2020-08-29 23:10:23 · 86 阅读 · 0 评论 -
JMM内存可见性
java内存模型JMM每个线程拥有自己的工作内存,不能直接操作主内存,每个线程都有自己的对共享变量的副本。线程间的传值必须通过主内存来完成。JMM的主内存JMM的工作内存JMM与Java内存区域划分是不同的概念层次主内存和工作内存的数据存储结构以及操作方式归纳JMM如何解决可见性问题指令重排序需要满足的条件为了提高性能,处理器和编译器常常对指令进行重排序,但是不能随意重排序。happens-before的八大原则volatile:JVM提供的轻量级同步机制volati原创 2020-08-29 21:48:49 · 128 阅读 · 0 评论 -
synchronized和ReentrantLock的区别
ReentrantLock(再入锁)ReentrantLock公平性设置public class ReentrantLockDemo implements Runnable { // 公平锁,true改为false就是非公平锁 private static ReentrantLock lock = new ReentrantLock(true); @Override public void run() { while (true) {原创 2020-08-27 23:10:27 · 881 阅读 · 0 评论 -
synchronized底层原理实现
实现synchronized的基础java对象头Monitor对象在内存中的布局hotspot虚拟机中,对象在内存中的布局分为三个区域对象头实例数据对齐填充这里只讲对象头对象头的结构Class Metadata Address是指向类元数据的指针,JVM通过这个指针来确定这个对象是哪个类的实例。Mark Word用于存储对象自身的运行时数据,是实现轻量级锁和偏向锁的关键。由于对象头的信息是与自身数据无关的额外存储成本,因此,考虑到JVM的空间效率Mark Word被设计为原创 2020-08-06 00:02:03 · 195 阅读 · 0 评论 -
synchronized不同方式的使用
public class SyncThread implements Runnable { @Override public void run() { String threadName = Thread.currentThread().getName(); if (threadName.startsWith("a")) { async(); } else if (threadName.startsWith("b"...原创 2020-07-22 00:26:49 · 138 阅读 · 0 评论 -
如何中断线程
已经被抛弃的方法使用stop()方法停止线程。可以用线程A去停止线程B。这种方法太过暴力,不安全。比如线程A调用线程B的stop()方法去停止线程B。调用时,A并不知道B执行的具体情况,这样突然的停止,会导致B的一些清理工作无法完成。并且,B执行stop()后,会立即释放锁,可能引起数据不同的问题使用suspend()和resume()方法目前使用的方法使用interrupt(),通知线程应该中断了。其实并没有中断线程。和yield()一样,只是一个提醒。具体是中断线程还是继续执行,由被通知的原创 2020-07-05 11:50:48 · 427 阅读 · 0 评论 -
yield方法
yield方法翻译提示调度程序当前线程愿意放弃当前对处理器的使用。调度器可以忽略这个提示。Yield是一种启发式的尝试,旨在改善线程之间的相对进程,否则会过度使用CPU。它的使用应该与详细的概要分析和基准测试相结合,以确保它实际具有预期的效果。使用这种方法是很不合适的。它对于调试或测试目的可能很有用,因为它可以帮助重现由于竞争条件造成的错误。在设计并发控制构造时,它可能也很有用,例如{@link java.util.concurrent.locks} 包.yield方法不会把当前线程原创 2020-07-05 11:08:54 · 1003 阅读 · 0 评论 -
notify和notifyAll的区别
想了解这两者的区别,首先要了解两个概念锁池 EntrySet等待池 WaitSet锁池等待池notify和notifyAll的区别原创 2020-07-05 10:29:44 · 192 阅读 · 0 评论 -
sleep和wait的区别
关于锁public class SleepWaitDemo { public static void main(String[] args) { Object o = new Object(); new Thread(() -> { System.out.println("thread a is waiting to get lock"); synchronized (o) { .原创 2020-07-04 18:58:12 · 179 阅读 · 0 评论 -
线程的状态
六个状态新建(New):创建后尚未启动的线程状态运行(Runnable):包含Running和Ready无限期等待(Waiting):不会被分配CPU执行时间,需要显式的唤醒以下是陷入无限等待的情况限期等待(Timed Waiting):在一定时间后会由系统自动唤醒以下是陷入限期等待的情况阻塞(Blocked):等待获取排它锁结束(Terminated):已终止线程的状态,线程已经结束执行...原创 2020-07-02 23:41:19 · 91 阅读 · 0 评论 -
如何实现处理线程的返回值
如何给run()方法传参构造函数传参成员变量传参回调函数传参如何实现处理线程的返回值有时,程序的运行依赖子任务的返回值。当子任务交给子线程去完成的时候,需要获取他们的返回值,这就要考虑如何获取子线程的返回值。有三种解决方式1.主线程等待法。主线程循环等待,直到目标子线程返回值为止public class CycleWait implements Runnable { private String value; @Override public void run()原创 2020-06-30 23:45:44 · 473 阅读 · 0 评论 -
Thread和Runnable的区别
Thread是一个类Runnable是一个接口Thread.java源码publicclass Thread implements Runnable { /* Make sure registerNatives is the first thing <clinit> does. */ private static native void registerNatives(); static { registerNatives(); }原创 2020-06-29 23:59:49 · 415 阅读 · 0 评论 -
Thread中的start和run方法的区别
Thread中start和run方法的区别由打印结果可以知道,当执行start()方法时,会创建一个新的线程Thread-0public class ThreadTest { private static void attack(){ System.out.println("fight"); System.out.println("current thread: "+Thread.currentThread().getName()); } pub原创 2020-06-28 23:43:55 · 200 阅读 · 0 评论 -
Java多线程和并发-进程和线程的区别
进程是资源分配的最小单位,线程是CPU调度的最小单位所有与进程相关的资源,都被记录在进程控制块(PCB)中进程是抢占处理机的调度单位;线程属于某个进程,共享其资源线程由堆栈寄存器、程序计数器和线程控制块(TCB)组成总结线程不能看成独立应用,进程可看作独立应用。进程有独立的地址空间,相互不影响,线程只是进程不同的执行路径。当某个进程出错,不会影响其他进程的运行,而某个线程出现问题,该线程所属的进程也会出现问题。线程有自己的堆栈和局部变量,但没有独立的地址空间,多进程的程序比多线程程序原创 2020-06-04 17:37:23 · 197 阅读 · 0 评论 -
Java垃圾回收-常见面试题
Object的finalize()方法的作用是否与C++的析构函数作用相同public class Finalization { private static Finalization finalization; /**finalize在gc回收中有不确定性,所以不推荐用finalize进行回收*/ @Override protected void finalize(){ System.out.println("finalized"); /原创 2020-05-27 00:38:27 · 1509 阅读 · 7 评论 -
Java垃圾回收-老年垃圾收集器
Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)单线程收集,进行垃圾收集时,必须暂停所有工作线程简单高效,Client模式下默认的老年代收集器Parallel Old收集器(-XX:+UseParallelOldGC,标记-整理算法)多线程,吞吐量优先在JDK6后出现。在早期,当新生代选择Parallel Scavenge收集器,老年代别无选择...原创 2020-03-28 23:17:03 · 259 阅读 · 0 评论 -
Java垃圾回收-新生代垃圾收集器
两个关于垃圾回收的关键词Stop-the-WorldJVM由于要执行GC而停止了应用程序的执行任何一种GC算法都会发生多数GC优化就是通过减少Stop-theWorld发生的时间来提高程序性能Safepoint分析过程中对象引用关系不会发生变化的点产生Safepoint的地方:方法调用;循环跳转;异常跳转等,如果发生GC,就让所有进程到安全点,如果不在安全点,就恢复线程,等所有...原创 2020-02-16 23:17:17 · 436 阅读 · 0 评论 -
Java垃圾回收-标记算法
标记算法对象被判定为垃圾的标准没有被其他对象引用:引用计数算法、可达性分析算法引用计数算法判断对象的引用数量来决定对象引用是否可以被回收。每个对象实例都有一个引用计数器,被引用则+1,完成引用-1任何引用计数为0的对象实例可以被当做垃圾收集优点:执行效率高,程序执行受影响较小缺点:无法检测出循环引用的情况,导致内存泄漏java并没有用这种方式判断对象是否为垃圾,而是使用可...原创 2020-02-16 12:47:48 · 274 阅读 · 0 评论 -
Java垃圾回收-回收算法
标记算法对象被判定为垃圾的标准没有被其他对象引用:引用计数算法、可达性分析算法引用计数算法判断对象的引用数量来决定对象引用是否可以被回收。每个对象实例都有一个引用计数器,被引用则+1,完成引用-1任何引用计数为0的对象实例可以被当做垃圾收集优点:执行效率高,程序执行受影响较小缺点:无法检测出循环引用的情况,导致内存泄漏java并没有用这种方式判断对象是否为垃圾,而是使用可...原创 2020-02-11 15:39:48 · 205 阅读 · 0 评论 -
栈和堆的区别
内存分配策略静态存储:编译时确定每个数据目标在运行时的存储空间要求。因而,可以在编译时就分配内存空间,这种分配策略,要求代码中不允许有可变数据结构的存在,也不允许有嵌套或递归的出现。因为他们都会导致程序在编译时无法计算准确的存储空间栈式存储:数据区需求在编译时未知,运行时模块入口前确定。在运行中,必须确定该程序模块需要的数据区的大小才能分配其内存。和所熟知的栈一样,按照先进后出的原则分配堆...原创 2020-02-10 13:45:31 · 94 阅读 · 0 评论 -
JVM内存模型
线程独占程序计数器Java虚拟机栈本地方法栈与虚拟机栈相似,主要作用于标注了native的方法线程共享元空间在jdk7时,字符串常量池 常量池被分配在了堆中。jdk8用元空间替代了永久代。java.lang.OutOfMemoryError:PermGen space这个异常将不再存在。因为默认的类的元数据分配,只受本地内存大小的限制,也就是说本地内存剩余多少,MetaS...原创 2020-02-09 21:03:56 · 91 阅读 · 0 评论 -
类的加载方式
通过new的方式,可以隐式加载,无需调用Class的newInstance方法,即可获取对象的实例。并且,new支持带参数的构造器创建对象。而Class的newInstance的不支持传入参数,需要通过反射,调用构造器的newInstance方法才能支持参数。类的装载了解类的装载过程,便于分析后面loadClass和forName的区别loadClass和forName的区别prot...原创 2020-02-08 17:16:34 · 133 阅读 · 0 评论 -
ClassLoader的双亲委派机制
加入自己写了一个实体类,通过ClassLoader进行装载,首先会检查CustomClassLoader时候已经装载过,如果没有,再一级一级的向上查找。而真正的装载正好相反,先加载BootstrapClassLoader管辖的类,再逐级的加载不同ClassLoader所管辖的类。ClassLoader中loadClass源码protected Class<?> loadClass...原创 2020-02-07 15:17:45 · 338 阅读 · 0 评论 -
ClassLoader
自定义ClassLoader其中重要的源码有protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { //...原创 2020-02-05 19:01:19 · 79 阅读 · 0 评论 -
JVM如何加载.class文件
Java虚拟机Native Interface本地接口的作用是融合不同的语言为Java所用,因为C语言或C++的执行效率还是要比Java高,所以在看源码时,有些方法上有native标识。为了不重复造轮子,不需要再开发一套库,而是直接进行调用,因此,JVM再内存中专门开辟了一块区域处理标记为native的代码。做法是在Native Method Stack中登记native方法,在Exe...原创 2020-02-04 18:32:37 · 257 阅读 · 0 评论 -
Spring注解之@Resource和@Inject
原创 2019-06-14 09:30:36 · 139 阅读 · 0 评论 -
Java发送邮件乱码问题
难受,没有根本解决问题,没搞懂怎么解决了情况:在properties配置文件中配置了java mail的subject、content 和其他配置,只有这两个是包含中文因为把properties文件设置成了utf-8,其他的也是这样设置。但是在接收的邮件中,中文都变成了这样。。。。。点击这里完æˆæ¿€æ´»好吧,去网上搜索,但是自己java mail没学好,用他们...原创 2019-01-13 21:10:30 · 2326 阅读 · 0 评论 -
使用postman测试接口需要登录
使用浏览器进行登录操作,将Cookie值复制下来,粘贴在postman的Header中,key为Cookie,value为复制下来的内容https://blog.csdn.net/pengbin790000/article/details/79386500...转载 2019-05-29 15:20:08 · 2774 阅读 · 0 评论