- 博客(123)
- 收藏
- 关注
原创 Java8的新特性
2.设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。1.非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。事实上,这并不是语言层面上的改变,更多的是编译器的技巧,底层的原理保持不变。
2025-03-14 23:05:36
882
1
原创 Java并发编程11--线程池
有助于避免 this 逃逸问题。this 逃逸:在构造函数返回之前其他线程就持有该对象的引用. 调用尚未构造完全的对象的方法可能引发令人疑惑的错误。Executor 框架不仅包括了线程池的管理,还提供了线程工厂、队列以及拒绝策略等,Executor 框架让并发编程变得更加简单如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任务时:抛出 RejectedExecutionException来拒绝新任务的处理。:调用执行自己的线程运行任务,也就是直接在调用execute。
2025-02-18 22:15:08
1275
原创 Java并发编程10--AQS
AQS 的全称为(AbstractQueuedSynchronizer),这个类在包下面AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器。
2025-02-18 12:56:51
1013
原创 Java并发编程9--线程间的通信
类型的变量副本,每个线程对其副本的操作互不影响。首先获取对象的锁,然后调用对象的。方法,放弃锁并进入对象的等待队列。随后获取对象的锁,并调用对象的。为每个线程维护了一个独立的。
2025-02-18 10:04:39
851
原创 Java并发编程8--线程
进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而超时等待状态相当于在等待状态的基础上增加了超时限制,也就是超时时间到达时将会返回到运行状态。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。通过调用线程的start()方法进行启动,随着run()方法的执行完毕,线程也随之终止。方法执行完毕),即便该线程在终结前被中断过,调用该线程对象的。
2025-02-17 21:58:24
371
原创 Java并发编程7--双重检查锁定
在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时,程序员可能会采用迟。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。在早期的JVM中,(甚至是无竞争的)存在巨大的性能开销。因此, 人们想出了一个聪明的技巧:双重检查锁定(人们想通过双重来降低同步的开销。假设A线程执行代码1的同时B线程执行代码2。此。
2025-02-17 21:21:57
695
原创 Java并发编程5--Java内存模型的基础
JMM(Jlava Memory Model)Java内存模型:定义了共享内存中多线程程序读写操作的行为规范,通过这些规则来规范对内存的读写操作从而保证指令的正确性。面试题:什么是JMM?JMM(Jlava Memory Model)Java内存模型:定义了共享内存中多线程程序读写操作的行为规范,通过这些规则来规范对内存的读写操作从而保证指令的正确性JMM把内存分为两块,一块是私有线程的工作区域(工作内存),一块是所有线程的共享区域(主内存)
2025-02-17 19:31:33
478
原创 Java并发编程4--Java并发机制的底层实现原理
JMM(Jlava Memory Model)Java内存模型:定义了共享内存中多线程程序读写操作的行为规范,通过这些规则来规范对内存的读写操作从而保证指令的正确性。在不同的硬件和不同的操作系统下,内存的访问是有一定的差异的,这种差异会导致相同的代码在不同的硬件和不同的操作系统下有着不一样的行为,而 Java 内存模型就是解决这个差异,统一相同代码在不同硬件和不同操作系统下的差异的。所有的变量(实例变量和静态变量)都必须存储在主内存中,每个线程也会有自己的工作内存。
2025-02-13 19:59:02
925
原创 JVM的类加载器
JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而Java程序能够启动起来。加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托如果该类委托上级没有被加载,子加载器尝试加载该类加载:查找和导入class文件验证:保证加载类的准确性准备:为类变量分配内存并设置类变量初始值解析:把类中的符号引用转换为直接引用初始化:对类的静态变量,静态代码块执行初始化操作使用:JVM 开始从入口方法开始执行用户的程序代码。
2025-02-12 20:58:11
1359
原创 JVM组成
Java堆是一个线程共享的区域:主要用来保存对象实例,数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError的异常保存类信息,静态变量,常量,编译后的代码。Java Virtual machine Stacks(java 虚拟机栈)每个线程运行时所需要的内存,称为虚拟机栈,先进后出每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法方法区(Method Area)
2025-02-12 19:55:46
1282
原创 Java并发编程3--多线程程序的创建及安全性问题
这段 Java 代码主要的功能是创建 10000 个线程,每个线程会计算从 0 到 1000 的整数之和,然后将这个和累加到类的静态变量result中。最后,主线程等待 10 秒后输出result的值。
2025-02-11 21:45:42
652
原创 Java并发编程2--死锁和银行家算法
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。称此时系统处于死锁状态或系统产生了死锁。称这些永远在互相等待的进程为死锁进程。
2025-02-11 18:46:36
1082
原创 Java并发编程1--并发的挑战+任务调度算法
综合考虑了等待时间和运行时间,当等待时间相同时,要求服务时间短的优先(SJF 算法的优点);当要求服务时间相同时,等待时间长的优先(FCFS 算法的优点)。对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题。
2025-02-11 17:00:40
1146
原创 Lambda表达式以及Steam操作
在Java中,Steam流是一种强大的数据处理工具,它允许我们对集合进行各种操作,如筛选、过滤、映射、分组等。这些操作可能是中间操作,返回一个Steam流,也可能是终端操作,返回一个结果。与传统的集合操作相比,Steam流具有一些独特的优势。首先,Steam流的操作不会影响原始集合,也不会存储数据。这意味着我们可以在不改变原始数据的情况下对数据进行处理。在传统的集合操作中,我们通常需要将数据复制到另一个集合中,这可能会导致额外的内存开销。
2025-02-11 08:21:13
840
原创 Comparable接口 VS Comparator接口
1)首先这两个接口一般都是用来实现集合内的排序,comparable还可以用于两个对象大小的比较。2)Comparable接口在java.lang包下面。里面有一个compareTo(T)接口方法。当一个类需要比较的时候,需自行实现Comparable接口的CompareTo方法。当调用集合排序方法的时候,就会调用对象的compareTo()方法来实现对象的比较。3)Comparator接口在java.util包下面。
2025-02-10 21:50:51
668
原创 Java中的值传递和引用传递
Java不管是基本类型还是引用类型,参数传递的方式只有一种:值传递而有两种表现:值传递和引用传递,是因为对象的属性不同。
2025-02-10 20:33:31
796
原创 final关键字
final修饰的全局变量必须赋值,因为final只能赋值一次定义的时候可以不赋值,使用必须赋值//全局变量,定义时必须赋初始值//全局变量是由默认值的。//如果是引用数据类型的话,null//整形---------》0//浮点型----------》0.0//布尔型----------》false//字符型------------》 (什么都不写,代表空)//定义的时候可以不赋值//使用的话,必须赋值(加不加final无影响)System.out.println("这是A");
2025-02-09 17:17:38
206
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人