笔记
尼獔
选择你所承担的,承担你所选择的
展开
-
变量的线程安全分析
1.成员变量和静态变量是否线程安全? 如果它们没有共享,则线程安全 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况 如果只有读操作,则线程安全 如果有读写操作,则这段代码是临界区,需要考虑线程安全 2.局部变量是否线程安全? 局部变量是线程安全的 但局部变量引用的对象则未必 如果该对象没有逃离方法的作用...原创 2022-03-01 11:40:54 · 136 阅读 · 0 评论 -
什么是守护线程?
默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。守护线程:只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。 比如:垃圾回收器线程就是一种守护线程....原创 2022-02-28 15:59:14 · 265 阅读 · 0 评论 -
Java的实参值如何传入方法呢?
Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本传入方法内,而参数本身不受影响。 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参...原创 2022-02-20 20:33:46 · 1568 阅读 · 0 评论 -
什么是字节码?采用字节码的好处是什么?
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。...原创 2022-02-19 21:10:11 · 522 阅读 · 0 评论 -
单链表的反转
链表 1>2>3>4 反转之后:4>3>2>1单链表的反转使用递归的思想就能轻松解决,使用递归完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点,直到把最后一个结点反转完毕,整个链表就反转完毕。递归次数 当前节点 下一节点 操作 返回值 第一次 1 2 Node(2).next = Node(1) Node(1).next = null ...原创 2022-01-04 16:02:27 · 184 阅读 · 0 评论 -
排序算法之插入排序
排序原理: 1.把所有的元素分为两组,已经排序的和未排序的; 2.找到未排序的组中的第一个元素,向已经排序的组中进行插入; 3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位; public static int[] sort(int a[]){ for (int i = 1; i < a.length...原创 2021-12-30 13:37:12 · 213 阅读 · 0 评论 -
排序算法之选择排序
排序原理: 1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较, 如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引。2.交换第一个索引处和最小值所在的索引处的值。// 选择排序 public static int[] sort(int a[]){ for (int i = 0; i < a.length - 1 ; i++){ ...原创 2021-12-29 18:02:06 · 133 阅读 · 0 评论 -
排序算法之冒泡排序
排序原理: 1. 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。 2. 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。 int a[] = {1,8,3,2,7}比较轮次 a[0] a[1] a[2] a[3] a[4] 每轮相邻元素比较的次数 数组初始状态 1 8 3 2 7 - 第一轮 1 3...原创 2021-12-29 17:01:30 · 50 阅读 · 0 评论 -
jdk线程池
1.状态表示: ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量状态名 高 3 位 接收新任 务 处理阻塞队列任 务 说明 RUNNING 111 是 是 初始状态 SHUTDOWN 000 否 是 不会接收新任务,但会处理阻塞队列剩余任务...原创 2021-12-24 17:02:57 · 177 阅读 · 0 评论 -
不可变类之保护性拷贝
保护性拷贝:在对资源进行操作时,不对操作资源本身进行修改,而是对资源内容进行复制,通过创建副本对象来避免共享安全问题. 以java中String对象为例: 不可变类条件:类、类中所有属性都是 final 的,保证了属性是只读的,不能修改,保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性.String类中如何保证通过保护性拷贝实现不可变的? 以substring方法为例(其他操作原理相同): public Strin...原创 2021-12-23 15:41:46 · 369 阅读 · 0 评论 -
解决CAS中ABA问题
ABA:当线程1要将A->C,但是其他线程在线程1执行过程中将A->B,然后又将B->A,这时候线程1cas时会成功执行,但是无法判断A是已经被改过的.解决: AtomicStampedReference通过这个原子类,使用版本号的方式解决ABA问题.static AtomicStampedReference<String> ref = new AtomicStampedReference<>("A", 0);public static voi...原创 2021-12-10 12:11:10 · 805 阅读 · 0 评论 -
synchronized和volatile对比
1.volatile和synchronized 语句块都可以保证变量的可见性。可见性:也就是当其他线程修改了共享变量,当线程执行读操作时都能拿到最新的变量内容(也就是从主存中拿,不会从工作内存中拿).这里的工作内存指的是JVM编译器会自身优化,JIT 编译器会将成员变量的值缓存至自己工作内存中的高速缓存中,减少对主存中变量的访问,提高效率. 举个例子:static boolean run = true; public static void main(String[] args...原创 2021-12-08 18:14:19 · 1714 阅读 · 0 评论 -
彻底搞懂interrupt(),isInterrupted(),interrupted()
1.interrupt()表示打断一个线程.interrupt():如果被打断线程正在 sleep,wait,join 会导致被打断 的线程抛出 InterruptedException,并清除打断标记,打断标记为false ;如果打断的正常运行的线程,则会设置打断标记 为true 1.1当打断sleep的线程: public static void main(String[] args) { Object object = new Obj...原创 2021-12-07 17:28:59 · 882 阅读 · 0 评论 -
什么是线程上下文切换(Thread Context Switch)
通俗的讲就是:cpu 不再执行当前线程的代码,转而执行另一个线程的代码 : java中常见的场景:1.线程的 cpu 时间片用完 2. 垃圾回收 3.有更高优先级的线程需要运行 4.线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法...原创 2021-12-07 16:39:14 · 254 阅读 · 0 评论 -
sleep(long n) 和 wait(long n) 的区别 :
1) sleep 是 Thread类中的方法,而 wait 是 Object 类中的方法,两者的定义位置不同. sleep:wait:2) sleep 不需要强制和 synchronized 配合使用,但 wait 需要 和 synchronized 一起用。 直接调用wait方法就会报非法状态异常,所以说wait必需搭配"锁"进行使用.只有当当前线程拿到了对象锁之后才能调用wait方法3) sleep 在睡眠的同时,不会释放对象锁的,但 wait 在等...原创 2021-12-06 11:57:28 · 256 阅读 · 0 评论 -
mysql高级
一.mysql逻辑架构: 1.连接层最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。2.服务层第二层架构主要完成大多少的核心服务功能,如SQL接口,并完成缓...原创 2021-10-19 19:25:01 · 58 阅读 · 0 评论 -
jvm字节码指令
1.基本概述 Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。 由于限制了Java虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能...原创 2021-10-12 11:35:38 · 212 阅读 · 0 评论 -
jvm垃圾回收器
1.原创 2021-09-27 14:39:19 · 191 阅读 · 0 评论 -
jvm垃圾回收概述
1.System.gc()理解 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显示触发Full GC, 而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(也就是说调用这个方法不确定会进行垃圾回收,只是提醒jvm垃圾回收器gc).如果同时使用System.runFinalization();则一定会执行gc.2.内存溢出和内存泄漏 OOM:没有空闲内存,并且垃圾收集器也无法提供更多的内存.内存...原创 2021-09-25 12:07:01 · 97 阅读 · 0 评论 -
jvm 垃圾回收算法
什么是垃圾? 垃圾是指在运行程序中没有任何指针指向的对象,即这个对象就是要被回收的对象.原创 2021-09-24 16:46:42 · 72 阅读 · 0 评论