笔记
高哇
这个作者很懒,什么都没留下…
展开
-
按照字母的出现频次进行排序
按照字母的出现频次进行排序,大小写敏感 public static void main(String[] args) { //Main main = new Main(); Scanner input = new Scanner(System.in); String s = input.nextLine(); HashMap <Character,Integer> table = new HashMap<>();原创 2021-10-11 15:07:07 · 232 阅读 · 0 评论 -
Error resoving template “xxx”的错误之一
[TOC]Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.一直报错,原因是返回的字符串和model里面加入的属性值同名了该.html的名字就好了...原创 2021-05-31 20:04:47 · 85 阅读 · 0 评论 -
自定义线程池
自定义线程池的创建1先创建一个阻塞队列,用于存放多余的任务下面展示一些 内联代码片。// A code blockvar foo = 'bar';原创 2021-04-27 12:11:51 · 89 阅读 · 0 评论 -
垃圾回收器
1串行(单线程)serial(新生代)+serialold(老年代)一个线程在垃圾回收时,其他线程要阻塞2吞吐量优先(多线程)单位时间内,让stw时间最短parallel+parallelold有几个cpu核,就有几个线程在进行垃圾回收,在垃圾回收时,cpu利用率很高。但是,不能有用户线程在工作。3响应时间优先(多线程)垃圾回收时,让单次stop the world 时间变短ConcMarkSweep+ParNew或者serialOld可以让用户线程和垃圾回收线程并发,不需要STW(CM原创 2021-04-24 22:05:06 · 56 阅读 · 0 评论 -
volatile的具体意义
volatile用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取他的值,线程操作volatile变量都是直接操作主存保证可见性写屏障保证在该屏障之前的,对共享变量的改动,都同步到主存中。读屏障保证在该屏障之后,对共享变量的读取,加载的是主存中最新的数据,而不是缓存中的数据保证有序性写屏障会确保指令重排序的时候,不会把写屏障之前的代码排在写屏障之后读屏障会确保指令重排序的时候,不会把读屏障之后的代码排在读屏障之前但是volatile不能解决指令交错原创 2021-04-20 23:08:56 · 211 阅读 · 0 评论 -
sleep和wait的区别
1 sleep是thread方法,wait是object方法2 sleep不需要强制和synchronized配合使用,但是wait需要3 sleep使用是不会释放对象锁,而wait使用时会释放对象锁原创 2021-04-18 12:47:53 · 77 阅读 · 0 评论 -
JMM的内存可见性保证
1 单线程程序。单线程程序不会出现内存可见性问题。编译器,runtime,处理器会共同确保单线程程序的执行结果与该线程在顺序一致性模型中的执行结果相同。2 正确同步的多线程程序。 正确同步的多线程程序执行将具有顺序一致性。也就是说,正确同步的多线程程序结果与在顺序一致性模型中执行的结果相同。JMM通过限制编译器,处理器对指令顺序的重排序(内存屏障)来确保内存可见性。3 未正确同步的多线程程序。JMM为多线程程序提供最小的安心性保障:线程执行时读取到的值,要么是之前某个线程写入的值,要么是默认的值(0,n原创 2021-04-14 11:08:42 · 241 阅读 · 0 评论 -
内存屏障的具体意义
编译器在生成字节码的时候,会在指令序列中插入内存屏障来禁止????特定类型的处理器重排序。1 storeStore屏障-禁止上面的普通写和下面的volatile写重排序。2 storeLoad屏障-防止上面的volatile写和下面的volatile读/写重排序。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3 loadLoad屏障-禁止下面所有的普通读操作和上面的volatile读重排序。4 loadStore屏障-禁止下面的所有普通写操作和上面的volatile读重排序。...原创 2021-04-12 22:27:56 · 337 阅读 · 0 评论 -
happens-before的具体含义
volatile变量的写-读可以实现线程之间的通信。从内存定义的角度来说,volatile的写-读与锁的释放-获取有相同的内存效果。happens-before介绍如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。这里提到的两个操作可以是一个线程之内(一个线程可以有多个操作),也可以是不同线程之间。happens- before规则1 程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。2 监视器锁规则:原创 2021-04-10 00:16:55 · 436 阅读 · 2 评论 -
多个线程之间如何通信
Java线程之间的通信由jmm控制,jmm(Java memory module)决定一个线程对共享变量的写入何时对另一个线程可见。线程之间的共享变量储存在主内存中,每个线程都有一个私有的本地内存线程A把共享变量的副本放在本地内存中,在本地内存中更新共享变量。然后本地内存把更新过的共享变量刷新到主内存中。线程B通过本地内存去读取线程A更新到主内存中的共享变量。而jmm通过控制主内存与线程本地内存交互,来控制Java线程之间的通信。...原创 2021-04-09 17:20:15 · 120 阅读 · 0 评论 -
顺序一致性内存模型
顺序一致性为程序员提供了极强的内存可见性保证。它有两大特征。1 一个线程中的所有操作必须按照程序的顺序来执行。2不管程序是否同步,所有的程序都只能看到一个单一的操作执行顺序,在顺序一致性内存模型中,每个操作都必须原子执行且立刻对其他所有线程可见。对于未同步的程序来说,顺序一致性模型的整体执行顺序是无序的(有很多个不同的线程),单个线程的操作执行顺序整体上是有序的,但是所有线程只能看到一个一致的整体执行顺序。对于jmm来说,不但整体的执行顺序是无序的(有多个线程),而且单线程的执行顺序是无序的,还有所有原创 2021-04-09 15:07:28 · 364 阅读 · 2 评论 -
cpu是什么
计算机由运算器,存储器,控制器,输入设备和输出设备组成五大部件组成。由于运算器和控制器在逻辑关系和电路结构上联系的十分紧密,因此,通常将它们称为中央处理器,简称cpu。把输入和输出设备称为I/o设备。主储存器和cpu联合称为主机。...原创 2021-04-08 19:40:29 · 874 阅读 · 0 评论 -
对象的内存布局
对象的内存分布在Hotspot中,对象在虚拟机中,分为对象头header,实例数据,对齐填充三个部分。对象的对象头包括两类信息,一类是储存对象自身的运行时数据,被称为Mark word。一类是类型指针。因为对象需要储存的运行时的数据很多因此,Mark word被设计为一个有着动态定义的数据结构,以便极小的空间里面可以存储尽量多的数据。类型指针可以用来确定该对象是那个类的实例。List item...原创 2021-04-07 16:19:06 · 62 阅读 · 0 评论