
java基础
文章平均质量分 64
huapro.vip
不忘初心
展开
-
synchronized底层源码
一、synchronized的使用场景synchronized一般使用在下面这几种场景:修饰代码块,指定一个加锁的对象,给对象加锁public Demo1{ Object lock=new Object(); public void test1(){ synchronized(lock){ } }}修饰静态方法,对当前类的Class对象加锁public class Demo2 { //形式一 public void test1原创 2022-03-11 10:01:18 · 1168 阅读 · 0 评论 -
synchronized修饰static方法与非static方法的区别
当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例),作用范围是整个静态方法,作用的对象是这个类的所有对象。当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象),作用范围是整个方法,作用对象是调用该方法的对象。结论:类锁和对象锁不同,他们之间不会产生互斥。public class SynchoronizedDemo { //synchronized修饰非静态方法 pu..原创 2022-03-11 09:39:06 · 1055 阅读 · 0 评论 -
ThreadLocal源码
This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typic原创 2022-03-10 09:32:35 · 93 阅读 · 0 评论 -
哪些是线程安全的容器?
同步容器类:使用了synchronized 1.Vector 2.HashTable并发容器: 3.ConcurrentHashMap:分段 4.CopyOnWriteArrayList:写时复制 5.CopyOnWriteArraySet:写时复制Queue: 6.ConcurrentLinkedQueue:是使用非阻塞的方式实现的基于链接节点的无界的线程安全队列,性能非常好。 (java.util.concurrent.BlockingQueue 接口代表了线程安全的队列。) 7.ArrayBloc原创 2022-03-05 08:50:24 · 768 阅读 · 0 评论 -
Spring 中事务方法的调用
前言Spring 提供了事务的管理机制,我们只需要在方法或者类上加上 @Transactional 注解进行事务管理。而非事务方法与事务方法之间相互调用,有时会使事务失效,本文是对该情形下的事务总结什么是事务传播机制事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务?父方法的回滚对子方法的事务是否有影响?这些都是可以通过事务传播机制来决定的。Spring 默认是 PROPAGATION_REQUIRED 机制。 下面来举一个例子: public class Demo {原创 2022-03-05 07:56:45 · 4462 阅读 · 0 评论 -
java多线程正确关闭的方法
假如说有两个线程,其中有一个线程对一块内存加了锁,那么另一个线程再同样访问这块内存时候就会被堵塞,一旦前一个线程暂停了,那么就凉了。假如说有两个线程,其中有一个线程在写数据的时候突然停止了,那么这块数据还可能未来的及清理,后者线程去操作内存就会出现异常,那么也凉了。结束线程并非是本意,实则是结束任务。只要任务结束那就结束了。那么中断的方法一般采用interrupt或boolean标志位判断线程是否中止采用isInterrupted,如果线程中有Thread.sleep方法,当设置中断后,执行这个方原创 2022-03-02 13:07:19 · 3610 阅读 · 0 评论 -
JAVA可重入锁死锁
可重入锁可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。synchronized 和 ReentrantLock 都是可重入锁。可重入锁的意义之一在于防止死锁。实现原理实现是通过为每个锁关联一个请求计数器和一个占有它的线程。当计数为0时,认为锁是未被占有的;线程请求一个未被占有的锁时,JVM将记录锁的占有者,并且将请求计数器置为1 。如果同一个线程再次请求这个锁,计数器将递增;每次占用线程退出同步块,计数器值将递减。直到计数器原创 2022-03-02 13:01:39 · 532 阅读 · 0 评论 -
JAVA获取时间戳三种方法及效率
目前获取毫秒值大概有下面三种方法//方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 new Date().getTime();到底哪个更快呢?然后做了如下实验:import java.util.Calendar; import java.util.Date; public class TimeTest {原创 2022-02-21 09:33:07 · 1483 阅读 · 0 评论 -
Java日志框架SLF4J和log4j以及logback的联系和区别
1.SLF4J(Simple logging Facade for Java)意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j,logback,java.util.logging等,它们才实现了具体的日志系统的功能。如何使用SLF4J?既原创 2022-02-18 15:02:27 · 231 阅读 · 0 评论 -
java并发编程
1、原子性一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行2、可见性多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果3、有序性程序的执行顺序按照代码的先后顺序来执行...原创 2022-02-17 10:11:14 · 128 阅读 · 0 评论 -
JAVA并发编程——守护线程(Daemon Thread)
在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在原创 2022-02-17 09:54:59 · 235 阅读 · 0 评论 -
java对象池commons-pool-1.6详解
java对象池commons-pooljava对象池commons-pool-1.6详解(一)对象的创建和销毁在一定程度上会消耗系统的资源,虽然jvm的性能在近几年已经得到了很大的提高,对于多数对象来说,没有必要利用对象池技术来进行对象的创建和管理。但是对于有些对象来说,其创建的代价还是比较昂贵的,比如线程、tcp连接、rpc连接、数据库连接等对象,因此对象池技术还是有其存在的意义。Apache-commons-pool-1.6提供的对象池主要有两种:一种是带Key的对象池,这种带Key的对象池是把相原创 2022-02-16 11:23:14 · 273 阅读 · 0 评论 -
AQS(AbstractQueuedSynchronizer)阻塞队列
AQS 队列同步器是用来构建锁或其他同步组件的基础框架,它使用一个 volatile int state 变量作为共享资源,如果线程获取资源失败,则进入同步队列等待;如果获取成功就执行临界区代码,释放资源时会通知同步队列中的等待线程。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,对同步状态进行更改需要使用同步器提供的 3个方法 getState、setState 和 compareAndSetState ,它们保证状态改变是安全的。子类推荐被定义为自定义同步组件的静态内部原创 2022-02-15 16:36:08 · 528 阅读 · 0 评论 -
java线程池相关
1、线程池有什么好处?降低资源消耗,复用已创建的线程,降低开销、控制最大并发数。隔离线程环境,可以配置独立线程池,将较慢的线程与较快的隔离开,避免相互影响。实现任务线程队列缓冲策略和拒绝机制。实现某些与时间相关的功能,如定时执行、周期执行等。2:线程池处理任务的流程?① 核心线程池未满,创建一个新的线程执行任务,此时 workCount < corePoolSize。② 如果核心线程池已满,工作队列未满,将线程存储在工作队列,此时 workCount >= corePoolSize原创 2022-02-15 16:29:42 · 263 阅读 · 0 评论 -
java web 请求过程经历了什么
执行流程键入域名回车域名解析作用: DNS解析的作用是把域名解析成相应的IP地址,根据IP地址决定将报文发给谁。浏览器开始解析域名,即查找过程.浏览器自身DNS缓存(缓存一分钟,最大1000条左右)-->操作系统自身DNS缓存-->本机host文件映射-->Windows调用53端口发送UDP请求本地配置首选DNS服务器--> Root Server获取gTLD Server--> gTLD Server获取Name Server-->Name S原创 2022-02-15 16:12:47 · 507 阅读 · 0 评论 -
java 常见基础面试题
1. StringBuffer 和 StringBuilder的比较相同点继承层次相同底层都是用字符数组实现,字符串都是可变的;都是将大部分操作委托给父类;初始容量都是16和扩容机制都是”旧容量*2+2”不同点StringBuffer是线程安全的,StringBuilder不是线程安全的。StringBuffer从JDK1.0就有了,StringBuilder是JDK5.0增加的StringBuffer比StringBuilder多了一个toStringCache字段,用来在toStri原创 2022-02-11 16:47:38 · 86 阅读 · 0 评论 -
hashmap 详解
hash map原创 2022-02-11 15:34:04 · 731 阅读 · 0 评论 -
java优雅停机
kill 命令常用的信号选项:(1) kill -2 pid 向指定 pid 发送 SIGINT 中断信号, 等同于 ctrl+c.(2) kill -9 pid, 向指定 pid 发送 SIGKILL 立即终止信号.(3) kill -15 pid, 向指定 pid 发送 SIGTERM 终止信号.(4) kill pid 等同于 kill 15 pidSIGINT/SIGKILL/SIGTERM 信号的区别:(1) SIGINT (ctrl+c) 信号 (信号编号为 2), 信号会被当前进程原创 2022-02-08 15:06:19 · 1221 阅读 · 0 评论 -
Java™ Platform, Standard Edition 8 API Specification
PackagesPackageDescriptionjava.appletProvides the classes necessary to create an applet and the classes an applet uses to communicate with its applet context.ja转载 2017-09-03 22:44:15 · 1546 阅读 · 0 评论 -
mabatis配置文件加载过程
mabatis配置文件加载过程第一次写尝试用markdown写个人博客,万事开头难,后期针对某一主题反复迭代吃透程序运行过程程序结构测试类 @Test public void test08() throws IOException{/* Logger logger=Logger.getLogger(Mytest.class); logger.f原创 2017-09-03 17:21:40 · 425 阅读 · 0 评论 -
SecureRandom简介
SecureRandom是强随机数生成器,主要应用的场景为:用于安全目的的数据数,例如生成秘钥或者会话标示(session ID),在上文《伪随机数安全性》中,已经给大家揭露了弱随机数生成器的安全问题,而使用SecureRandom这样的强随机数生成器将会极大的降低出问题的风险。本文给大家简单介绍一下SecureRandom的相关知识,首先看一下SecureRandom与Random的关系。S转载 2017-09-06 11:00:53 · 9095 阅读 · 1 评论 -
Thread 源码分析
线程是程序的一个执行流程,Java虚拟机允许多个线程同时并发执行。 1. 构造方法 Java代码 public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } // target - 任务 public Thread(Runnable targ转载 2017-09-13 22:22:36 · 309 阅读 · 0 评论 -
Java虚拟机(HOTSPOT)源代码编译步骤
概述hotspot源代码包含在openjdk7中openjdk7包含了jdk的Java代码,所以要用jdk6对这部分代码进行编译。(有点类似于gcc高版本代码要用gcc低版本编译一样)准备openjdk 7 源代码http://pan.baidu.com/s/1c2lZ3Tu密码:2lvn强烈建议初学者,用这个jdk源代码,按照下面的原创 2017-09-09 23:17:57 · 938 阅读 · 0 评论 -
深入理解Java虚拟机--上
第2章 Java内存区域和内存溢出异常2.2 运行时数据区域 图 2-1 Java虚拟机运行时数据区2.2.1 程序计数器 程序计数器可以看作是当前线程所执行的字节码的行号指示器,线程私有。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行转载 2017-09-09 23:24:03 · 341 阅读 · 0 评论 -
Java虚拟机工作原理
首先我想从宏观上介绍一下Java虚拟机的工作原理。从最初的我们编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件,然后JRE加载Java字节码文件,载入系统分配给JVM的内存区,然后执行引擎解释或编译类文件,再由即时编译器将字节码转化为机器码。主要介绍下图中的类加载器和运行时数据区两个转载 2017-09-09 23:29:22 · 253 阅读 · 0 评论 -
classloader
ClassLoader应该是每一个Java程序员都必须了解的,但是我整整工作了四年才发现原来在这方面全是空白,现在在做模块化,必须得了解这方面的知识,模块间必须做隔离. 以下是我这段时候的学习和总结,很多东西都是借网上的资料,JDK的ClassLoader的API,做如下总结: 1.类加载器概述 类加载器是一个对象,是负责加载类.在JVM是通过类加载器的调用LoadClass方法加载类转载 2017-09-10 00:24:10 · 253 阅读 · 0 评论 -
Java transient关键字使用小记
哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transient关键字的使用,涨下姿势~~~好了,废话不多说,下面开始:1. transient的作用及使用方法我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序转载 2018-04-14 17:30:13 · 233 阅读 · 0 评论 -
java标准类库
[]lang包:该包提供了Java语言进行程序设计的基础类,它是默认导入的包。该包里面的Runnable接口和Object、Math、String、StringBuffer、System、Thread以及Throwable类需要重点掌握,因为它们应用很广。Util包:该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。IO原创 2017-09-03 22:20:56 · 13200 阅读 · 2 评论