java基础
文章平均质量分 60
爱做梦的阿彭
一分耕耘,一分收获
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
内存泄漏和内存溢出
内存泄漏(memory leak): 是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。内存溢出(out of memory): 指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。内存泄露量大到一定程度会导致内存溢出。但是内存溢出不一定是内存泄露引起的。内存泄漏的分类(按发生方式来分类)分类原创 2021-08-12 11:06:47 · 186 阅读 · 0 评论 -
并发的可达性分析
并发的可达性分析jvm如何判断对象是否应该回收引用计数算法在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。但是,引用计数法不能解决循环依赖问题。Object 1和Object 2其实都可以被回收,但是它们之间还有相互引用,所以它们各自的计数器为1,则还是不会被回收。所以,Java虚拟机没有采用引用计数法。它采用的是可达性分析算法。可达性分析算法可达性分析算法的思路就是通过一系列的“GC Roots原创 2021-07-13 22:15:36 · 342 阅读 · 0 评论 -
CAS机制
CAS机制Java语言CAS底层如何实现?利用unsafe提供了原子性操作方法。什么是ABA问题?怎么解决?当一个值从A更新成B,又更新会A,普通CAS机制会误判通过检测。利用版本号比较可以有效解决ABA问题。cas是什么?cas是compareandswap的简称,从字面上理解就是比较并更新,简单来说:从某一内存上取值V,和预期值A进行比较,如果内存值V和预期值A的结果相等,那么我们就把新值B更新到内存,如果不相等,那么就重复上述操作直到成功为止。cas能做什么?可以解决多线程并发安原创 2021-07-12 23:19:38 · 121 阅读 · 0 评论 -
volatile的有序性问题
volatile的有序性问题volatile关键字使用禁止指令重排序,在一定程度上保证了有序性。指令重排计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排,一般分为以下3种:源代码 --> 编译器优化的重排 --> 指令并行的重排 --> 内存系统的重排 --> 最终执行的指令单线程环境里确保程序最终执行结果和代码顺序执行的结果一致。处理器在进行重排序时要考虑指令之间的数据依赖性。多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能原创 2021-07-12 23:03:49 · 243 阅读 · 0 评论 -
volatile的原子性问题
volatile的原子性问题volatile不保证原子性容易出现写覆盖volatile不保证原子性问题解决方法前加synchronized解决public synchronized void addPlusPlus() { number++;}加锁解决// 使用锁保证数据原子性Lock lock = new ReentrantLock();public void addPlusPlus() { lock.lock(); number++; lock.unlock();原创 2021-07-12 22:59:23 · 196 阅读 · 0 评论 -
volatile关键字
volatile关键字volatile关键字的两层语义一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。禁止进行指令重排序。使用了volatile关键字,保证了可见性,同时禁止指令重排序,在一定程度上保证了有序性,但需要注意的是volatile不保证原子性。volatile关键字的使用场景synchronized关键字是防止多个线程同原创 2021-07-12 22:51:14 · 134 阅读 · 0 评论
分享