
java底层相关
文章平均质量分 71
底层
RomanBesson
这个作者很懒,什么都没留下…
展开
-
ABA问题是什么?以及相关解决办法。
多线程问题--aba原创 2022-08-11 11:35:28 · 425 阅读 · 0 评论 -
黑马程序员并发笔记-juc并发以及锁原理-总集篇-结合自己的思考和心得完整版
黑马程序员并发编程笔记(一)–进程的概念黑马程序员并发编程笔记(二)–java线程基本操作和理解java并发编程笔记(三)–管程(一)java并发编程笔记(三)–管程(二)java并发编程笔记(三)–管程(三)java并发编程笔记(三)–管程(四)java并发编程笔记(三)–管程(五)java并发编程笔记(四)–JMM内存模型java并发编程笔记(五)–共享模型之无锁java并发编程笔记(六)–共享模型之不可变java并发编程笔记(七)–juc工具类的使用共享模型之不可变...原创 2022-03-28 15:16:38 · 9680 阅读 · 0 评论 -
java并发编程笔记(七)--juc工具类的使用共享模型之不可变
七、juc工具类的使用1.线程池2.构造方法public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable&原创 2022-03-06 16:42:46 · 1126 阅读 · 0 评论 -
java并发编程笔记(六)--共享模型之不可变
1.SimpleDateFormat日期类的改进下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的,多线程的环境下会出现很多问题。SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");for (int i = 0; i < 10; i++) { new Thread(() -> { try { log.debug("{}", sdf.parse("1951-04-21")); }原创 2022-03-01 19:11:53 · 509 阅读 · 0 评论 -
java并发编程笔记(五)--共享模型之无锁
1.无锁解决线程安全问题就是使用CAS,利用乐观锁的不断确认,来保证线程安全 。乐观锁时原子系列类的方法,使用的时候需要创建原子系列对象。创建原子整数对象:AtomicInteger balance = new AtomicInteger();举个例子:interface Account { Integer getBalance(); void withdraw(Integer amount); /** * 方法内会启动 1000 个线程,每个线程做 -10 元 的操作原创 2022-02-28 19:44:24 · 769 阅读 · 0 评论 -
java并发编程笔记(四)--JMM内存模型
1.计算机结构输入设备:就是我们的鼠标,键盘存储器:对应的就是我们的内存,缓存运算器和控制器共同组成了cpu而输出设备就比如显示屏,打印机。我们重点来聊一下缓存:2.缓存其实,当我们说计算机运行效率低下,速度慢,往往不是cpu的锅。而问题所在一般都是内存访问速度太慢。CPU的运算速度和内存的访问速度相差比较大。这就导致CPU每次操作内存都要耗费很多等待时间。内存的读写速度成为了计算机运行的瓶颈。于是就有了在CPU和主内存之间增加缓存的设计。最靠近CPU的缓存称为L1,然后依次是L2,L3原创 2022-02-25 17:22:59 · 712 阅读 · 0 评论 -
java并发编程笔记(三)--管程(五)
8.活跃度死锁发生的条件定位死锁的方法死锁的典型问题–哲学家问题我们检测下死锁就比如,我们把随后一个哲学家阿基米德拿筷子的顺序更改,就不会发生死锁。变成:new Philosopher("阿基米德", c5, c1).start();但是这种解锁方法会引起饥饿。使得阿基米德哲学家很难吃饭。更好的解决办法后面有叙述。。。活锁活锁出现在两个线程互相改变对方的结束条件,后谁也无法结束。避免活锁的方法在线程执行时,中途给予不同的间隔时间即可。死锁与活锁的区别死锁是因为原创 2022-02-24 17:51:07 · 1022 阅读 · 0 评论 -
异步模式之生产者消费者
4.异步模式之生产者消费者刚才的情况,我们一直都在讨论,一个执行者对应一个接收者的情况。下面,我们来讨论另外一种情况,多个生产者对应多应多个消费者的情况。//消息类class Message { private int id; private Object message; public Message(int id, Object message) { this.id = id; this.message = message; }原创 2022-02-23 18:06:14 · 155 阅读 · 0 评论 -
保护性暂停模式
2.模式之保护性暂停public class Test2 { public static void main(String[] args) { String hello = "hello thread!"; Guarded guarded = new Guarded(); new Thread(()->{ System.out.println("想要得到结果"); synchronized (guarded) { System.out.println("结果是:"原创 2022-02-23 18:05:37 · 274 阅读 · 0 评论 -
java并发编程笔记(三)--管程(四)
2.模式之保护性暂停public class Test2 { public static void main(String[] args) { String hello = "hello thread!"; Guarded guarded = new Guarded(); new Thread(()->{ System.out.println("想要得到结果"); synchronized (guarded) { System.out.println("结果是:"原创 2022-02-23 18:04:42 · 1019 阅读 · 0 评论 -
黑马程序员jvm笔记总集
黑马程序员jvm笔记(一)–程序计数器 虚拟机栈 堆黑马程序员jvm笔记(二)–方法区 串池 直接内存黑马程序员jvm笔记(三)–垃圾回收部分心得黑马程序员jvm笔记(四)–字节码部分心得黑马程序员jvm笔记(五)–类加载部分心得黑马程序员jvm笔记(六)–JMM内存模型部分心得...原创 2022-02-22 16:31:09 · 9371 阅读 · 1 评论 -
java并发编程笔记(三)--管程(三)
1.wait notify 原理持有Owner的锁对象调用wait方法(obj.wait),就会使当前线程进入WaitSet中,变为WAITING状态。处于BLOCKED和WAITING状态的线程都为阻塞状态,CPU都不会分给他们时间片。但是有所区别:BLOCKED状态的线程是在竞争对象时,发现Monitor的Owner已经是别的线程了,此时就会进入EntryList中,并处于BLOCKED状态WAITING状态的线程是获得了对象的锁,但是自身因为某些原因需要进入阻塞状态时,锁对象调用了原创 2022-02-22 16:27:20 · 775 阅读 · 0 评论 -
java并发编程笔记(三)--管程(二)
习题:卖票请改正:public class ExerciseSell { public static void main(String[] args) { //2000张票 TicketWindow ticketWindow = new TicketWindow(2000); //买票的线程 List<Thread> list = new ArrayList<>(); // 用来存储买出去多少张票 List<Integer> sellCo原创 2022-02-21 17:51:39 · 1232 阅读 · 0 评论 -
黑马程序员jvm笔记(六)--JMM内存模型部分心得
JMM内存模型1.计算机结构输入设备:就是我们的鼠标,键盘存储器:对应的就是我们的内存,缓存运算器和控制器共同组成了cpu而输出设备就比如显示屏,打印机。我们重点来聊一下缓存:2.缓存其实,当我们说计算机运行效率低下,速度慢,往往不是cpu的锅。而问题所在一般都是内存访问速度太慢。CPU的运算速度和内存的访问速度相差比较大。这就导致CPU每次操作内存都要耗费很多等待时间。内存的读写速度成为了计算机运行的瓶颈。于是就有了在CPU和主内存之间增加缓存的设计。最靠近CPU的缓存称为L1,然后原创 2022-02-20 17:45:41 · 399 阅读 · 0 评论 -
黑马程序员jvm笔记(五)--类加载部分心得
11.类加载阶段第一阶段:加载将类的字节码载入方法区(1.8后为元空间,在本地内存中)中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有:_java_mirror 即 java 的类镜像,例如对 String 来说,它的镜像类就是 String.class,作用是把 klass 暴露给 java 使用_super 即父类_fields 即成员变量_methods 即方法_constants 即常量池_class_loader 即类加载器原创 2022-02-19 19:47:30 · 7701 阅读 · 0 评论 -
黑马程序员jvm笔记(四)--字节码部分心得
10.字节码部分这部分,主要介绍了类的字节码文件,以及从更深层的角度去理解类是怎么被加载的。 jvm的内存结构10.1.字节码文件的分析1.获得字节码文件得到如下的字节码文件0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09 0000原创 2022-02-17 12:27:32 · 1985 阅读 · 0 评论 -
“只出现一次的数字”系列 剑指offer--位运算学习(一)
最近学了下位运算,简单说说收获吧。首先我们要了解下常见的位运算操作:与或非操作异或操作进阶规律:与或非 和 异或都是满足结合律的。//重点a&b&c=ab(b|c)a^a=0a^(~a)=10^b=b我们先来看看第一道题:做这道题需要一个重要的知识点:a^b^a=a^a^b=0^b=b也就是说一堆数一起异或,最后剩下的应该是非偶数重复数的异或和。上面的问题重复的数都是偶数,就一个不重复的数。我们将它异或,结果就是我们要的数。代码如下:c原创 2022-02-05 19:53:47 · 1710 阅读 · 0 评论 -
java并发编程笔记(三)--管程(一)
4.共享模型之管程4.1.线程中的安全问题举个例子:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?static int counter = 0;public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i < 5000; i++) { co原创 2022-02-03 19:33:00 · 2961 阅读 · 2 评论 -
黑马程序员jvm笔记(三)--垃圾回收部分心得
8.垃圾回收8.1.如何判断对象可以垃圾回收?有两种判断类是不是垃圾的办法 分别是 引用计数法和可达性分析。引用计数法引用计数法有个弊端,循环引用时,两个对象的计数都为1,导致两个对象都无法被释放例如老师视频里举的例子:A对象引用了B对象,同时B对象引用了A对象,导致了循环引用。可达性分析(jvm使用)JVM中的垃圾回收器通过可达性分析来探索所有存活的对象扫描堆中的对象,看能否沿着GC Roott对象为起点的引用链找到该对象,如果找不到,则表示可以回收可达性分析测试方法:原创 2022-02-01 20:33:02 · 3681 阅读 · 1 评论 -
黑马程序员并发编程笔记(一)--进程的概念
1.聊聊线程和进程1.1.进程和线程的概念什么是进程?可以理解为,进程就是存储在静态资源(磁盘)里的程序(指令和数据)运行时的一种状态,通俗的理解,进程就是运行时的程序。注释:程序由数据和指令组成,这些指令要读写,就必须把指令加载到cpu,数据加载到内存 。进程就是来加载指令,管理内存,管理io的注意:内存一般指的是运行内存,因为小时候不准确的概念,我们常常将内存和磁盘存储相关联,但二者不相同。当一个程序被调用时,它就作为一个进程,从磁盘加载到内存之中。一个程序可以有多个进程(记事本)也原创 2022-01-26 19:20:49 · 2617 阅读 · 1 评论 -
黑马程序员并发编程笔记(二)--java线程基本操作和理解
3.java进程的基本操作3.1.创建进程方法一,直接使用 Thread// 构造方法的参数是给线程指定名字,,推荐给线程起个名字(用setName()也可以)Thread t1 = new Thread("t1") { @Override // run 方法内实现了要执行的任务 public void run() { log.debug("hello"); }};t1.start();方法二,使用 Runnable 配合 Thread把【线程】和【任务】(要执行的代码)分开,T原创 2022-01-26 19:20:02 · 7301 阅读 · 1 评论 -
黑马程序员jvm笔记(二)--方法区 串池 直接内存
6.方法区方法区是一个概念,它包括常量池+ClassLoader+Class还有串常量(StringTable)。在逻辑上,方法区算是堆内存的一部分使用的是堆的永久代的内存,但是在实际实现上,不一定用堆的内存。而在1.8之后增加了元空间这种概念,将方法区的实现从堆内存改到了操作系统内存。它的结构如下:6.1.内存溢出1.8以前会导致永久代内存溢出1.8以后会导致元空间内存溢出6.2.常量池常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了原创 2022-01-25 19:11:22 · 4451 阅读 · 0 评论 -
黑马程序员并发编程笔记(一)
1.聊聊线程和进程1.1.进程和线程的概念什么是进程?可以理解为,进程就是存储在静态资源(磁盘)里的程序(指令和数据)运行时的一种状态,通俗的理解,进程就是运行时的程序。注释:程序由数据和指令组成,这些指令要读写,就必须把指令加载到cpu,数据加载到内存 。进程就是来加载指令,管理内存,管理io的注意:内存一般指的是运行内存,因为小时候不准确的概念,我们常常将内存和磁盘存储相关联,但二者不相同。当一个程序被调用时,它就作为一个进程,从磁盘加载到内存之中。一个程序可以有多个进程(记事本)也原创 2022-01-21 19:10:53 · 2729 阅读 · 0 评论 -
黑马程序员jvm笔记(一)--程序计数器 虚拟机栈 堆
jvm精学1.什么是 JVM ?定义:Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境)好处:一次编写,到处运行自动内存管理,垃圾回收功能数组下标越界检查2.常见的jvm2.1简单了解jvm3.程序计数器3.1.程序计数器的作用什么是程序计数器,它是干什么用的?java中程序计数器是用寄存器实现的,它的作用是寻找下一个要执行的程序。当我们的java程序被编译成二进制字节码文件后,如下图:右面,是我原创 2022-01-20 19:06:37 · 2507 阅读 · 0 评论 -
java并发(二)--.JMM内存模型对并发的保障
2.JMM内存模型1.计算机结构输入设备:就是我们的鼠标,键盘存储器:对应的就是我们的内存,缓存运算器和控制器共同组成了cpu而输出设备就比如显示屏,打印机。我们重点来聊一下缓存:2.缓存其实,当我们说计算机运行效率低下,速度慢,往往不是cpu的锅。而问题所在一般都是内存访问速度太慢。CPU的运算速度和内存的访问速度相差比较大。这就导致CPU每次操作内存都要耗费很多等待时间。内存的读写速度成为了计算机运行的瓶颈。于是就有了在CPU和主内存之间增加缓存的设计。最靠近CPU的缓存称为L1,原创 2022-01-09 12:04:54 · 365 阅读 · 0 评论 -
java并发(一)--并发编程的三个问题
1.并发编程的三个问题1.可见性问题可见性概念可见性(Visibility):是指一个线程对共享变量进行修改,另一个先立即得到修改后的最新值。在实际应用中,我们需要保证可见性,但是如果不用特殊的方法保证的话,线程之间是不具有可见性的。往往会出现的情况就是,一个线程明明把常量改了,已经运行的线程里这个常量值还是使用了没有更改前的。用个具体的案例来揭示这个问题:package com.xxx.concurrent_problem;/** 案例演示: 一个线程对共享变量的修原创 2022-01-09 12:03:15 · 509 阅读 · 0 评论 -
虚拟机栈的作用以及特点
4.虚拟机栈每个线程运行时所需要的内存,称为虚拟机栈。在jvm里,方法的临时储存是在栈里完成的。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。 (正在运行的方法)线程里的方法是逐次的进入对应的栈里的,最顶上的方法是当前执行的,被称为活动栈桢。方法全部执行完后,会反着退出栈。之后被清除。4.1有关栈的问题垃圾回收是否涉及栈内存?不涉及,因为栈的运行结束后会按从顶至底的顺序移除栈对应的线程的方法,所以不需要垃原创 2021-11-30 19:57:37 · 627 阅读 · 0 评论 -
程序计数器的作用--简单易懂
3.程序计数器什么是程序计数器,它是干什么用的?java中程序计数器是用寄存器实现的,它的作用是寻找下一个要执行的程序。当我们的java程序被编译成二进制字节码文件后,如下图:右面,是我们写的代码,左面是二进制字节码形式(.class)它们将由我们的解释器来将他们转换为机械码,从而让机器运行。细心的你会发现,每个二进制字节码的前面都有一个类似于索引的数字。他们的作用也跟索引差不多,为当前程序标一个序号,记上他们的地址。即使有了地址,解释器也不知道他们的顺序是什么样的,他只负责运行。于是原创 2021-11-30 19:05:56 · 4773 阅读 · 0 评论 -
JUC并发----并发和并行的概念
2.并发和并行2.1.并发单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是 同时运行的 。总结为一句话就是: 微观串行,宏观并行 ,一般会将这种 线程轮流使用 CPU 的做法称为并发, concurrent通俗理解:一个核心轮流调用各个线程。2.2.并行通俗来讲:就是多个核心在一个时间里执行不同的线程。原创 2021-11-12 12:11:46 · 588 阅读 · 0 评论 -
JUC并发----线程和进程
1.1.进程和线程的概念什么是进程?可以理解为,进程就是存储在静态资源(磁盘)里的程序(指令和数据)运行时的一种状态,通俗的理解,进程就是运行时的程序。注释:程序由数据和指令组成,这些指令要读写,就必须把指令加载到cpu,数据加载到内存 。进程就是来加载指令,管理内存,管理io的注意:内存一般指的是运行内存,因为小时候不准确的概念,我们常常将内存和磁盘存储相关联,但二者不相同。当一个程序被调用时,它就作为一个进程,从磁盘加载到内存之中。一个程序可以有多个进程(记事本)也可以只有一个进程(网原创 2021-11-12 12:10:13 · 436 阅读 · 0 评论 -
JMM是什么?
JMM是什么?注意:当面试官问你关于java内存模型的事,你一定要确定他问的是JVM的哪些内存分布还是JMM的内存模型。JMM(Java Memory Model)是java的一种内存模型,是一种内存管理规则。Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他是一个抽象的概念。JMM是内存分配的一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的原子性、可见性(缓存一致性)以及有序性问题。关于原子性,可见性和有原创 2021-07-10 16:42:47 · 628 阅读 · 0 评论 -
JVM---GC和GC算法
GC和GC算法gc的作用在堆和方法区,分为轻GC和重GC。不详细划分的话,方法区算是堆的一部分,也可以说GC主要作用于堆。那么,就需要回顾一下堆的知识了,堆分为如下三个区域新生代(伊甸园 Eden)幸存区(form/0,to/1)老年区永久储存区GC会对伊甸园区和幸存者区进行清理,通常来说,大多数对象都会在伊甸园区被清理殆尽,存活下来的对象会进入幸存者区。而未被设置的情况下,在15次清理交换后仍旧存活下来的对象会被放到老年区。当然,我们可以手动设置对象在幸存区经历清理的次数下面,我原创 2021-07-07 09:04:38 · 224 阅读 · 0 评论