什么是线程安全这篇博客内容很好,直接偷过来:
什么是线程安全?如何保证线程安全?-CSDN博客
如何保证线程安全第一种:加锁。
在 Java 中通过添加synchronized关键字实现,对方法或者代码块进行互斥。
第二种:CAS非阻塞同步。
通过不断自旋进行重试,避免线程进入阻塞状态,挂起和唤醒都需要性能开销。
前面两种方式可以参考上面的博客和我写的锁的内容:Java多线程:(三)多线程锁、JUC锁的实现
第三种:ThreadLocal无同步方案。
线程本地存储:将共享数据的可见范围限制在一个线程中。这样无需同步也能保证线程之间不出现数据争用问题。
这种方式我结合后端开发一起介绍。
SpringBoot + ThreadLocal通常,我们会使用 synchronzed 关键字 或者 lock锁 来控制线程对临界区资源的同步顺序,但这种加锁的方式会让未获取到锁的线程进行阻塞,很显然,这种方式的时间效率不会特别高。
线程安全问题的核心在于多个线程会对同一个临界区的共享资源进行访问,那如果每个线程都拥有自己的“共享资源”,各用各的,互不影响,这样就不会出现线程安全的问题了,对吧?
顾名 ...
Java开发未读
Java高级:动态代理、反射动态代理什么是动态代理为了避免代码侵入式的修改,在程序运行时,目标对象不变,对目标对象生成代理对象,代理对象中的方法是目标对象方法的增强方法,最终达到目标对象增强的效果。
Java中动态代理的实现第一种:基于接口实现动态代理
基于接口的动态代理,用到的类是Proxy的newProxyInstance静态方法创建,要求被代理对象至少实现一个接口,如果没有,则不能创建代理对象。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface MyInterface void doSomething(); public class DynamicProxyDemo ...
前言据我看到的面试题有:判断垃圾回收的算法有什么,以及是什么原理,垃圾收集算法有什么,常见的垃圾回收器有什么,什么是STW等,所以这篇博客基于GC给大家介绍,如果有其他面试题可以在评论区发言,博客可修改内容,可添加。
一、判断垃圾回收的算法先提前说两个算法,分别是:
引用标记算法
可达性分析算法
.引用标记算法引用标记算法是在Java对象头(Java对象头在介绍多线程的时候有详细的解释,直达链接:Java多线程:三、多线程锁、java锁的实现)中开辟空间,记录被引用的次数(Reference Count),如果A变量被其他对象引用时计数器+,引用A变量的其他变量被删除则-,如果计数器为时,则判断A变量需要被回收。
举个例子:
String str = "我不想上早八";
此时,在Java虚拟机栈(以下简称栈)开辟一个内存空间记录str,此时堆中的字符串常量池的“我不想上早八”,被引用的次数就是(Reference CountD;),此时我做修改操作:
String str = "其实我想上早七";
此时,在栈中 ...
一、JDK .. 加锁机制ConcurrentHashMap 在 JDK . 中,提供了一种粒度更细的加锁机制,这种机制叫分段锁「Lock Striping」。整个哈希表被分为多个段,每个段都独立锁定。读取操作不需要锁,写入操作仅锁定相关的段。这减小了锁冲突的几率,从而提高了并发性能。
这种机制的优点:在并发环境下将实现更高的吞吐量,而在单线程环境下只损失非常小的性能。
可以这样理解分段锁,就是将数据分段,对每一段数据分配一把锁。当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
有些方法需要跨段,比如 size()、isEmpty()、containsValue(),它们可能需要锁定整个表而不仅仅是某个段,这需要按顺序锁定所有段,操作完后,再按顺序释放所有段的锁。如下图:
. jdk.之前的结构ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组+链表构成的。Segment 是一种可重入的锁 ReentrantLock,HashEntry 则用于存储键值对数据。
一个 ConcurrentHas ...
前言大部分内容由网上搜索,有直接复制粘贴的内容,本篇博客整理我查找的内容,且加入我个人的理解和个人需要了解的知识进行搜索得到的内容,有错误请在评论区留言
一、首先介绍一下锁操作系统层面的锁: 操作系统通过锁机制来管理进程(或线程)对共享资源的访问,以防止数据竞争和保证数据一致性。 常见的操作系统锁包括互斥锁(Mutex)、读写锁(Read-Write Lock)、自旋锁(Spinlock)等,它们用于控制对临界区(Critical Section)的访问。
这里介绍一下“临界区”的概念。所谓“临界区”,指的是某一块代码区域,它同一时刻只能由一个线程执行。
Java多线程的锁: Java中的锁是Java编程语言中用于实现多线程同步和互斥的机制。 Java提供了多种类型的锁,如synchronized关键字、ReentrantLock类、ReadWriteLock等,用于控制多线程对共享资源的并发访问。
首先需要明确的一点是:Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁。在上一节最后一点讲synchronized的时候有提到,synchronized可 ...
文章包括八股的JMM模型、volatile关键字、synchronized关键字、重排序等内容,来,试试看~
Java开发未读
Java多线程:(一)线程池全文干货了解线程池,知道java面试中线程的内容会问什么
一、函数式接口只有一个抽象方法的接口就成为函数式接口。同时,引入了一个新的注解:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了 @FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。
举例几个Java常用的函数式接口:predicate断言型接口、consumer消费者接口、supplier提供者接口、Function接口等。
记好一句话:函数式接口可以接收匿名内部类和lambda表达式
记好一句话:函数式接口可以接收匿名内部类和lambda表达式
记好一句话:函数式接口可以接收匿名内部类和lambda表达式
全文重点:
俗话说,new一个接口就要new他的实现类对象,但是假设我不存在函数时接口的实现类对象,那么一般就使用匿名内部类的形式创建对象。创建出来的匿名内部类需要实现函数式接口中全部(其实就一个)的抽象方法。既然是匿名内部类的抽象方 ...