自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 Java注解

除了内置注解,我们还可以定义自己的注解。自定义注解使用@interface关键字来声明,可以包含元素(成员变量)和默认值。

2024-04-26 08:11:01 532

原创 Java反射

java反射通俗来讲就是解剖类,并允许以编程的方式解剖类中的各个成分(构造器,成员变量,方法)。

2024-04-25 21:48:14 757 1

原创 JVM基础面试题第一篇

可作为GC roots的对象包括虚拟机栈和本地方法栈中引用的对象,类静态属性引用的对象,常量引用的对象。常见的内存溢出包括堆内存溢出、栈溢出等。运行时常量池是方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池表,用于存放编译器生成的各种字面量与符号引用,这部分内容在类加载后存放到运行时常量池。引用计数:在对象中添加一个引用计数器,如果被引用,计数器加1,引用失效,计数器减1,如果计数器为0,则可以被当成垃圾回收,但是避免不了循环引用的问题,就是两个对象相互指向。

2024-04-18 21:54:41 1259

原创 JVM基础第二篇

可达性分析法是Java中主要采用的垃圾回收算法,它通过从一组称为"GC Roots"的根对象开始,递归遍历所有对象的引用关系图,标记所有能够被从GC Roots到达的对象为存活对象,而无法被到达的对象则被判定为可回收对象。这种方法可以有效处理循环引用的情况,是Java中主要的垃圾回收算法。标记-清除算法是最早期的垃圾回收算法之一,它分为标记和清楚两个阶段在标记阶段,从跟对象开始,递归遍历所有可达对象,并对它们进行标记。在清除阶段,遍历整个堆内存,将未标记的对象进行清除。

2024-04-15 19:35:23 907

原创 List和Map的几种初始化方法

以上是一些常见的 Map 集合初始化方法,每种方法都有其适用的场景和特点,根据实际需求选择合适的方法即可。

2024-04-14 12:30:12 436

原创 并发基础面试题第一篇

多线程编程中一般线程的个数大于CPU核心的个数,而一个CPU核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU采取的策略是为每个线程分配时间片并轮转的形式,当一个线程时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。死锁是指两个或者两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都将无法推进下去。此时系统产生了死锁。多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。

2024-04-11 08:10:32 1228

原创 JVM基础第一篇

虚拟机栈(Virtual Machine Stack)是Java虚拟机(JVM)内存结构中的一部分,用于存储方法执行的信息,每个线程都有自己独立的虚拟机栈。每个方法在执行时都会在虚拟机栈上创建一个栈帧本地方法栈是java虚拟机内存结构中的一部分,与虚拟机栈类似,但是是专门用于执行本地方法(native method)的过程。每个线程都有自己独立的本地方法栈。用于存储java程序运行时创建的对象实例和数组。所有对象的实例都存储在堆中。Java 虚拟机有一个在所有 Java 虚拟机线程之间共享的方法区。

2024-04-10 07:31:45 1358 1

原创 并发线程基础第九篇

AQS(AbstractQueuedSynchronizer)是java中用于构建锁和同步器的抽象基类。它提供了一种基于FIFO等待队列的锁和同步器的实现框架,是并发编程中实现锁和同步器的重要基础。AQS提供了两种基本的同步原语:独占锁和共享锁。独占锁是指同一时刻只能有一个线程持有的锁,典型的代表是ReentrantLock。共享锁是指同一时刻可以被多个线程持有的锁,典型的代表是 CountDownLatch 和 Semaphore。

2024-04-05 20:08:13 1341 1

原创 并发线程基础第八篇

FunctionalInterface // 拒绝策略//1.任务队列//2.锁//生产者条件变量//4.消费者条件变量//5.容量//超时的阻塞添加try{//将时间统一转化为纳秒try {//awaitNanos()方法,返回的时间是一个剩余时间,把返回的时间重新赋值给它,防止虚假唤醒,从头再等return t;}finally {//阻塞获取//获取任务的时候需要保证线程安全,需要加一把锁try{try {return t;

2024-04-04 10:10:32 996

原创 并发线程基础第七篇

享元模式(Flyweight Pattern)是一种结构型设计模式,用于优化多个具有相似状态或者相似对象的内存占用。

2024-04-01 06:50:49 463

原创 并发线程基础第六篇

Unsafe对象提供了非常底层的,操作内存,线程的方法,Unsafe对象不能直接调用,只能通过反射获得。AtomicInteger,LockSupport中的park,unpark方法底层都是采用Unsafe实现的。获取Unsafestatic {try {设置自定义AtomicDatastatic {try {// data 属性在 DataContainer 对象中的偏移量,用于 Unsafe 直接访问该属性。

2024-03-31 11:52:46 1957

原创 并发线程基础第五篇

happens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结,抛 开以下 happens-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其它线程对该共享变量的读可见。它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取到它的值,线程操作volatile变量都是直接操作主存。读屏障保证在该屏障之后,对共享变量的读取,加载的是主存中最新的数据,而不是缓存中的。

2024-03-29 07:11:27 786

原创 并发线程基础第四篇

可重入(Reentrancy)指的是一个线程或进程可以再次进入自己已经持有的锁,而不会出现死锁或其他异常情况。在Java中,重入性是指同一个线程在持有锁的情况下能够再次获取该锁,而不会被自己所持有的锁所阻塞。synchronized关键字和ReentrantLock类都是可重入锁的典型代表。当一个线程已经持有了某个对象的锁时,它可以再次获取这个锁而不会被阻塞,这种机制就是可重入性的体现。

2024-03-27 06:58:43 875

原创 并发线程基础第三篇

obj.wait()让进入到Object监视器的线程到waitSet等待obj.notify()从监视器的waitSet等待的线程挑一个唤醒obj.notifyAll()唤醒全部在Object上waitSet等待的线程obj.wait(Long)让该线程等待一定的时间,到时间自动唤醒示例@Slf4jlog.debug("我是线程一");//让线程在obj上一直等待下去log.debug("我是线程一,我被唤醒了");}).start();

2024-03-26 07:45:18 1151

原创 并发线程基础第二篇

把锁想象称一个房子,锁对象就是一把钥匙,钥匙不同,房子不同,如果操作同一静态变量,还是会造成线程不安全的问题。每个java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁之后,该对象头的Mark Word(可以去搜一下具体的java对象头底层是什么)中就被设置指向Monitor对象的指针。:如果在尝试加轻量级锁的过程中,cas操作无法成功,这时一种情况就是有其他线程已经为此对象加上了轻量级锁(表明有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。

2024-03-24 15:53:05 1112

原创 并发线程基础第一篇

有一种特殊的线程叫做守护线程,只要其他非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。垃圾回收器线程就是一种守护线程,Tomcat中的Acceptor和Poller线程都是守护线程,所以Tomcat接收到shutdown命令后,不会等它们处理完当前请求。当Context Switch发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java中对应的概念就是。启动线程,前面我们已展示过,注意,一个线程只能一次,只能调用一次start()方法。以调用角度来讲,如果。

2024-03-23 08:00:00 1667

原创 Java基础面试题第四篇

try、catch和finally都不能单独使用,只能是try-catch、try-finally或者try-catch-finally。try语句块监控代码,出现异常就停止执行下面的代码,然后将异常移交给catch语句块来处理。finally语句块中的代码一定会被执行,常用于回收资源。throws:声明一个异常,告知方法调用者。throw :抛出一个异常,至于该异常被捕获还是继续抛出都与它无关。

2024-03-22 07:43:05 697

原创 Java基础面试题第三篇

保存字符串的数组被final修饰且为私有,并且String类没有提供/暴露修改这个字符串的方法String类被final修饰导致其不能被继承,进而避免了子类破坏String不可变。在Java9之后,String,StringBuilder,StringBuffer的实现改用byte数组存储字符串。

2024-03-21 08:08:48 708

原创 Java基础面试题第二篇

浅拷贝是指在复制对象时,只复制对象本身和其内部的基本数据类型的成员变量,而不会复制对象内部的引用类型成员变量。新对象和原对象中的引用类型成员变量将引用相同的对象。因此,对于浅拷贝的新对象和原对象来说,它们共享相同的引用类型成员变量,对其中一个对象的引用类型成员变量进行修改会影响另一个对象。深拷贝是指在复制对象时,不仅复制对象本身,还会递归复制对象内部所有的引用类型成员变量,直到复制完所有的引用对象。深拷贝生成的新对象和原对象完全独立,对新对象进行修改不会影响原对象,因为它们引用的是不同的对象。

2024-03-20 08:16:56 825

原创 java语言

可变长参数(Variable Arguments)是指在方法声明中允许传递数量可变的参数。在Java中,可变长参数允许方法接受零个或多个参数,这些参数被视为一个数组,在方法内部可以像处理数组一样进行操作。在Java中,可变长参数由省略号...表示,它必须是方法参数列表中的最后一个参数。当调用可变长参数方法时,你可以传递任意数量的参数,甚至可以传递零个参数。编译器会将传递的参数封装成一个数组,然后传递给可变长参数方法。以下是一个使用可变长参数的示例:// 可变长参数方法。

2024-03-19 07:52:23 574 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除