avatar
文章
360
标签
49
分类
10
首页
时间轴
分类
关于
Logo只有那年胜过年年
搜索
首页
时间轴
分类
关于

只有那年胜过年年

深入浅出 Java 中的包装类
发表于2025-10-14|后端
什么是包装类型Java 设计当初就提供了 8 种 基本数据类型及对应的 8 种包装数据类型。我们知道 Java 是一种面向对象编程的高级语言,所以包装类型正是为了解决基本数据类型无法面向对象编程所提供的。 下面是基本数据类型与对应的包装类型。 基本数据类型 包装类型 byte Byte boolean Boolean short Short char Character int Integer long Long float Float double Double 下面是包装类型的继承结构图。 从以上图表可以对基本类型和包装类型有一个全面的了解。 包装类应用场景1、集合类泛型只能是包装类; // 编译报错 List<int> list1 = new ArrayList<>(); // 正常 List<Integer> list2 = new ArrayList<>(); 2、成员变量不能有默认值; private int ...
Java虚拟机对锁优化所做的努力
发表于2025-10-14|后端
作为一款公用平台,JDK 本身也为并发程序的性能绞尽脑汁,在 JDK 内部也想尽一切办法提供并发时的系统吞吐量。这里,我将向大家简单介绍几种 JDK 内部的 “锁” 优化策略。 1、 锁偏向锁偏向是一种针对加锁操作的优化手段。 如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而提高了程序性能。因此,对于几乎没有锁竞争的场合,偏向锁有比较红啊的优化效果,因为连续多次极有可能是同一个线程请求相同的锁。而对于锁竞争比较激烈的场合,其效果不佳。因为在竞争激烈的场合,最有可能的情况是每次都是不同的线程来请求相同的锁。 2、 轻量级锁如果偏向锁失败,即上一个请求的锁的线程和这个线程不是同一个。偏向锁失败意味者不能避免做同步操作。此时,虚拟机并不会立即挂起线程。他会使用一种成为轻量级锁的优化手段。 轻量级锁的操作也很方便,它只是简单地将对象头部作为指针,指向蚩尤锁的线程堆栈的内部,来判断一个线程是否持有对象锁。 如果线程获得轻量级锁成功,则可以顺利进入临界区。如果轻量级锁失败,则表示其他线程抢先争夺了锁,那么当前线...
Synchronized 与 ReentrantLock 的区别!
发表于2025-10-14|后端
可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。 锁的实现: Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别。前者的实现是比较难见到的,后者有直接的源码可供阅读。 性能的区别: 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。 功能区别: 便利性:很明显Synchronized的使用比较方便简洁,并且由编译器...
一文搞懂 Java 线程中断
发表于2025-10-14|后端
try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } 此时线程被打断后,代码会继续运行或者抛出异常结束运行,这并不是我们需要的中断线程的作用。 到底是什么是线程中断?线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一个中断信号,如果目标线程没有接收线程中断的信号并结束线程,线程则不会终止,具体是否退出或者执行其他逻辑由目标线程决定。 我们来看下线程中断最重要的 3 个方法,它们都是来自 Thread 类! 1、java.lang.Thread#interrupt 中断目标线程,给目标线程发一个中断信号,线程被打上中断标记。 2、java.lang.Thread#isInterrupted() 判断目标线程是否被中断,不会清除中断标记。 3、java.lang.Thread#interrupted 判断目标线程是否被中断,会清除中断标记。 ...
Synchronized 有几种用法?
发表于2025-10-14|后端
我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面。其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法。 1、同步普通方法这个也是我们用得最多的,只要涉及线程安全,上来就给方法来个同步锁。这种方法使用虽然最简单,但是只能作用在单例上面,如果不是单例,同步方法锁将失效。 /** * 用在普通方法 */ private synchronized void synchronizedMethod() { System.out.println("synchronizedMethod"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } 此时,同一个实例只有一个线程能获取锁进入这个方法。 2、同步静态方法同步静态方法,不管你有多少个类实例,同时只有一个线程能获取锁进入这个方法。 &#x...
到底什么是重入锁,拜托,一次搞清楚!
发表于2025-10-14|后端
什么是重入锁 java.util.concurrent.locks.ReentrantLock 这个是 JDK @since 1.5 添加的一种颗粒度更小的锁,它完全可以替代 synchronized 关键字来实现它的所有功能,而且 ReentrantLock 锁的灵活度要远远大于 synchronized 关键字。 从类结构图看出,ReentrantLock 实现了 Lock 接口,ReentrantLock 只是 Lock 接口的一个实现而已。 java.util.concurrent.locks.Lock 它们都是 java.util.concurrent 包里面的内容(俗称 JUC、并发包),也都是 JDK 1.5 开始加入的。 为什么叫重入锁呢?ReentrantLock,我们把它拆开来看就明了了。 Re-Entrant-Lock:即表示可重新反复进入的锁,但仅限于当前线程; public void m() { lock.lock(); lock.lock(); try { // ......
出场率比较高的一道多线程安全面试题
发表于2025-10-14|后端
工作一两年的应该都知道 ArrayList 是线程不安全的,要使用线程安全的就使用 Vector,这也是各种 Java 面试宝典里面所提及的,可能很多工作好几年的程序员都停留在这个知识面上。 先说说为什么 ArrayList 是线程不安全的吧,来看以下的代码。 /** * */ public class TestArrayList { private static List<Integer> list = new ArrayList<>(); public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 10; i++) { testList(); list.clear(); } } private static void testList() throws InterruptedException ...
多线程 Thread.yield 方法到底有什么用?
发表于2025-10-14|后端
概念我们知道 start() 方法是启动线程,让线程变成就绪状态等待 CPU 调度后执行。 那 yield() 方法是干什么用的呢?来看下源码。 /** * A hint to the scheduler that the current thread is willing to yield * its current use of a processor. The scheduler is free to ignore this * hint. * * <p> Yield is a heuristic attempt to improve relative progression * between threads that would otherwise over-utilise a CPU. Its use * should be combined with detailed profiling and benchmarking to * ensure that it actually has the desired effect. ...
多线程通信的三大法器,你真的会用吗?
发表于2025-10-14|后端
wait, notify, notifyAll 是多线程之间通信最重要的 3 个方法,今天,栈长给大家普及一下它们的知识要点及应用实战。 定义wait:让持有该对象锁的线程等待; notify: 唤醒任何一个持有该对象锁的线程; notify: 唤醒所有持有该对象锁的线程; 它们 3 个的关系是,调用对象的 wait 方法使线程暂停运行,通过 notify/ notifyAll 方法唤醒调用 wait 暂时的线程。 然而,它们并不是 Thread 类中的方法,而是 Object 类中的,为什么呢!? 因为每个对象都有监视锁,线程要操作某个对象当然是要获取某个对象的锁了,而不是线程的锁。 如图所示,wait 带时间表示最大超时时间,过了时间还不唤醒就会自动唤醒线程重新竞争对象锁。 几个重要的点1、调用对象的 wait, notify, notifyAll 方法需要拥有对象的监视器锁,即它们只能在同步方法(块)中使用; 2、调用 wait 方法会使用线程暂停并让出 CPU 资源,同时释放持有的对象的锁; 3、多线程使用 notify 容易发生死锁,一般使用 notifyA...
并行任务执行神器 Fork & Join 实战
发表于2025-10-14|后端
Fork/Join是什么?Fork/Join框架是Java7提供的并行执行任务框架,思想是将大任务分解成小任务,然后小任务又可以继续分解,然后每个小任务分别计算出结果再合并起来,最后将汇总的结果作为大任务结果。其思想和MapReduce的思想非常类似。对于任务的分割,要求各个子任务之间相互独立,能够并行独立地执行任务,互相之间不影响。 Fork/Join的运行流程图如下: 我们可以通过Fork/Join单词字面上的意思去理解这个框架。Fork是叉子分叉的意思,即将大任务分解成并行的小任务,Join是连接结合的意思,即将所有并行的小任务的执行结果汇总起来。 工作窃取算法ForkJoin采用了工作窃取(work-stealing)算法,若一个工作线程的任务队列为空没有任务执行时,便从其他工作线程中获取任务主动执行。为了实现工作窃取,在工作线程中维护了双端队列,窃取任务线程从队尾获取任务,被窃取任务线程从队头获取任务。这种机制充分利用线程进行并行计算,减少了线程竞争。但是当队列中只存在一个任务了时,两个线程去取反而会造成资源浪费。 工作窃取的...
1…343536
avatar
2025
文章
360
标签
49
分类
10
公告
🌸 春去秋来,花开花落 📚 桌上的日历又薄了几页 💭 记忆中的昨天还那么清晰
最新文章
掌握 Spring 框架这 10 个扩展点,开发效率直接翻倍2025-11-10
Minikube安装教程2025-11-07
Deepseek 本地部署各个版本超级详细教学,网页版、软件版2025-11-04
Slow HTTP POST 慢速攻击2025-10-30
JDK 紧急漏洞,XMLDecoder反序列化攻击2025-10-30
分类
  • 其他3
  • 区块链4
  • 后端225
  • 安全漏洞3
  • 工具30
  • 性能4
  • 教程1
  • 数据库21
  • 架构15
  • 程序人生54
标签
文章LinuxJVM分布式技术其他区块链基础安全漏洞多线程性能优化新特性架构算法程序人生行业动态规范资料集合进阶面试Elastic JobdockerJWTDubboMyBatisNettyShiroSpringSpring MVCSpring CloudTomcatSpring BootZookeeper日志开源综合技术消息队列缓存连接池Eclipse
归档
  • 2025年11月 3
  • 2025年10月 355
  • 2025年09月 1
  • 2024年12月 1
网站信息
文章数目 :
360
本站访客数 :
本站总浏览量 :
最后更新时间 :
访客地图
© 2025 By 2025
搜索
数据加载中