Java
猴子奔跑
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
i++不是原子性操作解决方法
使用i++,内存中主要流程:把i的数值,从内存读入寄存器。(寄存器在CPU上)寄存器将数值+1。将寄存器的值写回内存。测试代码:public class IPPTest { private static int a=0; public static void main(String[] args) { for (int i = 0; i < 10000; i++) { new Thread(()->{原创 2021-06-27 14:38:54 · 1011 阅读 · 0 评论 -
偏向锁、轻量级锁、重量级锁
1. 偏向锁1.1 引入的目的 为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径。因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令。1.2 执行流程获取锁:检测Mark Word是否为可偏向状态,即是否为偏向锁1,锁标识位为01;若为可偏向状态,则测试线程ID是否为当前线程ID,如果是,则执行步骤(5),否则执行步骤(3);如果线程ID不为当前线程ID,则通过CAS操作竞争锁,竞争成功,则将Mark Word的线程原创 2021-06-27 12:38:51 · 919 阅读 · 0 评论 -
剖析 Java并发关键字synchronized以及优化
synchronized的作用范围:synchronized修饰成员变量和非静态方法,锁的是对象的实例。synchronized void method() {//业务代码}synchronized修饰静态方法时,锁住的是Class实例,因为static是JVM层面的方法,属于Class而不属于对象。synchronized void staic method() {//业务代码}synchronized修饰一个代码块时,锁住的是所有代码块中的对象。synchronize原创 2021-06-25 23:02:35 · 936 阅读 · 0 评论 -
CPU密集型、IO密集型
CPU密集型(CPU-bound)CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于CPU bound转载 2021-06-22 23:40:40 · 1417 阅读 · 0 评论 -
线程的生命周期
调用new方法创建一个线程(New)调用start启动一个线程(Runnable)处于就绪状态的线程等待获取CPU资源,获取CPU资源之后线程会执行run方法进入运行状态(Running)正在运行的线程调用yield方法或者失去CPU资源就会再次进入就绪状态。正在运行的线程执行sleep方法、I/O阻塞、等待同步锁等都会挂起线程进入阻塞状态,进入Blocked池(Blocked)阻塞状态由于sleep时间到、I/O方法返回、获得同步锁等会再次进入就绪状态。正在运行的线程调用run方法或者ca..原创 2021-06-22 23:34:01 · 1279 阅读 · 0 评论 -
线程池的拒绝策略
转载自链接static是Java中的一个关键字,我们不能声明普通外层类或者包为静态的。static用于下面四种情况。1.静态变量:我们可以将类级别的变量声明为static。静态变量是属于类的,而不是属于类创建的对象或实例。因为静态变量被类的所有实例共用,所以非线程安全的。通常静态变量还和关键字final一起用,作为所有对象共用的资源或常量。如果静态变量不是私有的,那么可以通过ClassName.variableName来访问它....原创 2021-06-18 22:24:08 · 1676 阅读 · 0 评论 -
线程池的核心参数以及线程池的工作流程
序号 参数 说明 1 corePoolSize 核心线程数量 2 maximumPoolSize 最大线程数量 3 keepAliveTime 当前线程数量超过最大线程数量,空闲线程最大存活时间 4 unit keepAliveTime的时间单位 5 workQueue 任务队列 6 threadFactory 线程工厂,用于创建线程 7 handler 由于线程任务过多或者其他原因导原创 2021-06-18 21:23:51 · 1741 阅读 · 0 评论 -
Java单例模式
单例模式的设计是保证了一个类在整个系统中同一时刻只有一个实例存在,主要是被用于一个全局类的对象在多个地方被使用并且对象的状态是全局变化的场景下。单例模式为系统资源的优化提供了一个很好的思路,频繁创建和销毁对象都会增加系统的资源消耗,单例模式很好的节约了资源。1️⃣不安全类public class UnsafeLazyInitialization { private static UnsafeLazyInitialization instance; //加上Synchronized来保证原创 2021-06-16 22:45:05 · 2098 阅读 · 1 评论 -
常见垃圾回收器
**CMS收集器:**实现了用户线程和垃圾回收线程同时工作#mermaid-svg-vZ8WqMZrGGMxVtSA .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-vZ8WqMZrGGMxVtSA .label text{fill:#333}#mermaid-svg-vZ8WqMZrGGMxVtSA .no.原创 2021-06-09 14:48:18 · 1385 阅读 · 0 评论 -
JVM类加载过程
**加载:**将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入,这个过程需要类加载器参与。连接: 将java类的二进制代码合并到JVM的运行状态之中验证:确保加载的类信息符合JVM规范,没有安全方面的问题准备:在方法区为类变量分配内存空间并设置类中变量的初始值**注意:**如果是final修饰的变量,会在准备阶段就将变量初始化为value值;如果没有fin...原创 2021-06-07 21:52:57 · 1356 阅读 · 0 评论 -
Java对象的创建过程
加载检查:首先虚拟机在遇到一条new指令的时候,会去检查这个指令的参数在常量池中是否可以定位到这个类的符号引用,并且检查该类是否被加载、解析、初始化过,如果没有就执行类的加载过程。**分配内存:**加载检查完就会为新生对象分配内存。分配内存的方式有两种:1️⃣指针碰撞 2️⃣空闲列表(选择哪一种内存分配方式取决于堆内存是否完整,而堆内存是否完整又取决于用了哪一种GC算法)指针碰撞的分配方式适用于内存规整的情况下,即GC算法采用了标记-清除-压缩算法,或者复制算法,因为在内存规整的情况下,已用内存...原创 2021-06-07 18:18:19 · 1533 阅读 · 2 评论 -
JVM分为哪几部分?
JDK1.8之前: JDK1.8: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CptavYim-1623059396709)(C:\Users\Venture\Desktop\Java\笔记文档\2022秋招面试题准备.asset原创 2021-06-07 17:50:31 · 3057 阅读 · 2 评论 -
JMM内存模型
说到底JMM其实是定义了线程和主存之间的关系。每个线程都有一个本地内存,存储了主存中共享变量、资源的副本。JMM控制了多个线程之间的通讯。通讯同步的约定:线程解锁前,必须把共享变量立刻刷回主存。线程加锁前,必须读取主存中的最新值到工作内存中!加锁和解锁是同一把锁JMM作为一个语言级的内存模型,在不同的编译器和处理器上,通过禁止特定类型的编译器和处理器重排序,提供一致的内存可见性保证。对于编译器重排序:JMM会禁止特定类型的编译器重排序对于处理器重排序:JMM会要求JVM在生成指令序列的时.原创 2021-06-05 15:29:01 · 1431 阅读 · 0 评论 -
LeetCode538. 把二叉搜索树转换为累加树
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) {..原创 2021-06-02 22:13:09 · 1411 阅读 · 0 评论 -
LeetCode230.二叉搜索树中第K小的元素
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { .原创 2021-06-02 22:11:25 · 1323 阅读 · 0 评论 -
LeetCode654.最大二叉树
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) {..原创 2021-06-02 16:14:58 · 1319 阅读 · 0 评论 -
HashMap在并发情况下出现死循环的问题?
HashMap的数据结构: HashMap是用一个指针数组(假设为table[])来做分散所有的key,当一个key被加入时,会通过Hash算法通过key算出这个数组的下标i,然后就把这个<key, value>插到table[i]中,如果有两个不同的key被算在了同一个i,那么就叫冲突,又叫碰撞,这样会在table[i]上形成一个链表。我们知道,如果table[]的尺寸很小,比如只有2个,如果要放进10个keys的话,那么碰撞非常频繁,于是一个O(1)的查找算法,就变成了链表遍历,性能原创 2021-05-28 15:44:52 · 1563 阅读 · 0 评论 -
说说你对HashMap的理解?
HashMap是一种存取高效但是不保证有序的常用容器。它的数据结构为“数组+链表”,这是解决哈希冲突的产物(链地址法)。它实现了Map接口,采用KEY-VALUE键值对的形式存储数据,并且实现了浅拷贝和序列化。 HashMap 的默认初始大小为16,初始化大小必须为2的幂,最大大小为2的30次方。数组中存储的链表节点为Entry数组,在jdk1.8源码中将Entry改为了Node,它们都实现了Map下的Entry接口。HashMap 的阈值默认为“容量*0.75f”,当存储节点数量超过该值,则对m原创 2021-05-28 11:48:07 · 1894 阅读 · 0 评论 -
String、StringBuffer、StringBuilder的区别?
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {} public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{}public final class StringBuil.原创 2021-05-23 21:56:30 · 1396 阅读 · 0 评论 -
#{}和${}的区别是什么?(Mybatis怎么防止SQL注入?)
属于静态文本替换,比如{}属于静态文本替换,比如属于静态文本替换,比如{driver}会被替换为com.mysql.jdbc.driver#{}是SQL的占位符,Mybatis会将SQL中的#{}替换为?,在 sql 执⾏前会使⽤PreparedStatement 的参数设置⽅法,按序给 sql 的?号占位符设置参数值。因此,#{}与${}相比,#{}可以很大程度的防止sql注入,因为对sql做了预编译处理,因此在使用中一般使用#{}方式。...原创 2021-05-23 21:51:42 · 1514 阅读 · 0 评论 -
Spring MVC中的控制器是不是单例模式?如果是,如何保证线程安全?
控制器是单例模式。单例模式下会出现线程安全问题。 Spring中保证线程安全的方法:将scope设置成非singleton。但是这样会有一些问题,当并发很大的时候如果每次都生成一个bean的话就会有很多实例。最好的方式是将controller控制器设置成无状态...原创 2021-05-22 22:39:00 · 4173 阅读 · 0 评论 -
Spring如何处理事务
Spring当中支持编程式事务和声明式事务**编程式事务:**通过Transaction Template手动管理事务,硬编码 ,实际应用中很少使用。声明式事务(基于XML和注解): 推荐使用(代码侵入性最小),实际是通过AOP实现。优点:不需要在业务代码中添加事务管理的代码,只需要在配置文件中做相应的事务规则就行。缺点:声明式事务只能针对方法级别,无法控制代码级别的事务管理。Spring中事务传播级别:public enum Propagation { REQUIRED(T原创 2021-05-22 22:25:24 · 1600 阅读 · 0 评论 -
什么是Spring?谈谈你对IOC和AOP的理解
Spring是一个企业级Java应用框架,它的作用主要是简化软件的开发流程以及配置过程,简化项目部署环境。 Spring的优点: 1、Spring的低侵入式设计,对业务代码的污染非常低。 2、Spring的DI机制将对象之间的关系交由框架处理,减少组件之间的耦合。 3、Spring提供了AOP技术,支持将一些通用的功能进行集中式管理,从而提供更好的复用。 4、Spring对于主流框架提供了非常好的支持。IOC:将创建对象的控制权交给Spring来进行管理。简单的来说就是应原创 2021-05-22 20:43:15 · 1999 阅读 · 0 评论 -
Spring容器的启动流程是怎么样的?
使用AnnotationConfigApplicationContext跟踪启动流程:public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this();//初始化reader()和scanner() register(componentClasses);//使用scanner组件来扫描basePackage包下的所有对象,将配置类的BeanDefinition注册到容器中 refresh原创 2021-05-22 20:41:28 · 1487 阅读 · 0 评论 -
Spring框架中Bean的创建过程是怎样的?
首先,简单来说,Spring框架的Bean经过四个阶段:实例化–>属性赋值–>初始化–>销毁 具体来说,Spring经过了以下几个步骤: 1.实例化:new xxx();两个时机:1、当客户端向容器申请一个bean时;2:当容器在初始化一个bean时发现还需要依赖另一个bean。BeanDefinition对象保存。 2.属性对象赋值(依赖注入):Spring通过BeanDefinition找到对象依赖的其他对象,并将这些对象赋予当前对象。 3.处理Aware接口:S原创 2021-05-22 20:38:59 · 1807 阅读 · 0 评论 -
Spring框架中的Bean是线程安全的吗?如果线程不安全,要如何处理?
Spring容器本身没有提供Bean的线程安全策略,因此,也可以说Spring容器中的bean不是线程安全的。 如何处理线程安全问题,分情况讨论: Spring的作用域(scope):singleton:单例,默认作用域。prototype:原型,每次创建一个新对象。request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。session:会话,同一个会话共享一个实例,不同会话使用不用的实例。global-sessi原创 2021-05-22 20:37:26 · 9856 阅读 · 5 评论 -
Spring如何处理循环依赖问题?
Spring使用了三级缓存来解决循环依赖的问题。三级缓存:Spring在启动的过程中,使用到了三个map,称作三级缓存。public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { /** Maximum number of suppressed exceptions to preserve. */ private static final int原创 2021-05-22 18:54:30 · 1319 阅读 · 0 评论 -
Java深拷贝和浅拷贝
Java深拷贝和浅拷贝浅拷贝浅拷贝介绍浅拷贝特点深拷贝深拷贝介绍深拷贝特点浅拷贝浅拷贝介绍浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。浅拷贝特点(1) 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以转载 2021-03-23 11:31:13 · 1312 阅读 · 0 评论 -
为什么我们调⽤ start() ⽅法时会执⾏ run() ⽅法,为什么我 们不能直接调⽤ run() ⽅法?
new ⼀个 Thread,线程进⼊了新建状态。调⽤ start() ⽅法,会启动⼀个线程并使线程进⼊了就绪状态,当分配到时间⽚后就可以开始运⾏了。 start() 会执⾏线程的相应准备⼯作,然后⾃动执⾏ run() ⽅法的内容,这是真正的多线程⼯作。 但是,直接执⾏ run() ⽅法,会把 run()⽅法当成⼀个 main 线程下的普通⽅法去执⾏,并不会在某个线程中执⾏它,所以这并不是多线程⼯作。总结: 调⽤ start() ⽅法⽅可启动线程并使线程进⼊就绪状态,直接执⾏ run() ⽅法的话不会以多原创 2021-03-16 21:37:25 · 1580 阅读 · 1 评论 -
Java面试文章整理
1、可见性(Visibility)可见性是指,当一个线程修改了某一个全局共享变量的数值,其他线程是否能够知道这个修改。显然,在串行程序来说可见性的问题是不存在的。因为你在任何一个地方操作修改了某个变量,那么在后续的程序里面,读取这个变量的数值,一定是修改后的数值。但是,这个问题在并行程序里面就不见得了。在并行程序里面,如果一个线程修改了某一个全局变量,那么其他线程未必可以马上知道这个变动。下面的图1展示了可见性问题的一种。如果在CPU1和CPU2上...原创 2021-03-13 14:13:47 · 1329 阅读 · 0 评论 -
面试题2 java静态方法与非静态方法的区别
转载博客:https://www.cnblogs.com/pretty-boy/p/3177494.html● 生命周期(Lifecycle):静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭。非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。● 在...转载 2021-03-11 11:37:58 · 1379 阅读 · 0 评论 -
面试问题1 array与ArrayList的区别
参考博客:https://www.cnblogs.com/wqbin/p/11185400.html ArrayList内部是由一个array实现的。如果你知道array和ArrayList的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array提供 O(1)的查找性能和很基本的方式去存储数据。ArrayList是Java集合框架类的一员,可以称它为一个动态数组。array是静态的,所以一个数据一旦创建就...转载 2021-03-11 11:35:14 · 1467 阅读 · 0 评论 -
SpringMVC日期类型转换器
第一种方法:添加日期转换类,实现 Converter 接口,该接口有两个泛型。package utils;import org.springframework.core.convert.converter.Converter;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class原创 2020-12-27 14:15:40 · 1251 阅读 · 0 评论 -
Setting autocommit to false on JDBC Connection 错误
使用Mybatis插入数据到Mysql数据库时,程序运行没有报错但是数据并没有插入。 public void testSave() throws Exception{ User user=new User(); user.setUsername("mybatis saveUser"); user.setAddress("上海市奉贤区"); user.setSex("M"); user.setBirthday(ne...原创 2020-11-18 20:49:54 · 4076 阅读 · 0 评论 -
剑指Offer编程题JZ1:二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。public class Solution { public boolean Find(int target, int [][] array) { for(int i=0;i<array.length;i++){ for(int j=0...原创 2020-10-07 17:18:44 · 375 阅读 · 0 评论 -
Java面试题
1、面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也...转载 2018-04-21 08:39:39 · 5252 阅读 · 0 评论 -
UINavigationBar的使用
新建工程,工程名为UINavigationBarTest1)增加ViewController成员变量 @implementation ViewController NSInteger count; UINavigationBar* navBar;2)在ViewController.m中创建导航项-(UINavigationItem*)makeNavItem{ UINavigationIt原创 2017-12-27 21:27:19 · 815 阅读 · 0 评论 -
Java中在特定区间产生随机数和随机字符
Java中在特定区间产生随机数和随机字符package chapter6;import java.util.Random;/** * @author: 努力努力丶 * @date:2017年11月7日 下午2:36:42 * */public class RandomTest { public static void main(String[] args) { //原创 2017-11-07 15:05:26 · 1619 阅读 · 0 评论
分享