Java面试题集(一直更新)

一、基础

  1. String的不可变性
String类内部管理的是:final char[]
  1. String ,StringBuffer,StringBuilder
String和StringBuilder、StringBuffer的区别在于:
    String声明的是不可变的对象,每次操作都会新增对象,再把指针指向新的对象。
    而StringBuilder和StringBuffer可以在原有对象基础上就行修改。
StringBuilder和StringBuffer的区别在于:
    StringBuilder是线程安全的(效率低),StringBuffer是线程不安全的(效率高)
  1. 基本类型和包装类型的区别,涉及自动装箱和拆箱,怎么做的,原理

二、集合

  1. List和Set区别
从三个方面来看:
	1)重复
	2)null
	3)顺序
	4)子类(接口)
	Collection
			->List
				->ArrayList
				->LinkedList
			->Set
				->HashSet
				->TreeSet
	Map
			->HashMap
			->TreeMap
  1. List排序如何排序?如何删除某个元素(迭代器+remove)
排序:
	自然排序和定制排序
	1)通过Collections.sort()==>
		传入一个参数:实现Comparable接口对象集合
		传入两个参数:传入对象集合和Comparator接口
	2)通过Lambda表达式
		Stream#sort()
删除:
	坑点:使用循环删除某个元素后list大小发生改变,后序元素位置发生改变,可能导致漏掉或者是抛出ConcurrentModificationException
	1)通过lambda的filter过滤
	2)通过Iterator,在利用Iterator的remove来删除()
  1. ArrayList的实现原理?如何去重?
优势,扩容,什么时候用
利用HashSet
  1. HashMap的实现原理
源码级掌握,扩容,红黑树,最小树化容量,hash冲突解决
第一:底层是:数组+链表
第二:当put某个元素的时候
	key==>key.hashCode()==>&%hash算法计算在数组下标位置==>链表(解决hash冲突;78下)
  1. HashMap的key需要注意什么?HashMap的hashcode作用?
  2. HashSet实现原理
  3. Hashtable
同步锁,
这块可能会问你synchronized关键字 1.6之后提升了什么,怎么提升的这些
  1. 集合类中哪些是线程安全的

三、多线程与并发

  1. 多线程的run和start的区别
    start()根据线程状态为0,调用start0()本地方法来创建一个线程
    run()
看源码:
1Start()===>Thread类中的start()start0()方法
public synchronized void start() {
        /**
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }

    private native void start0();


2.run()==>Thread类中target属性和run()方法
/* What will be run. */
private Runnable target;
@Override
public void run() {
     if (target != null) {
         target.run();
     }
 }
  1. JMM内存模型和volatile
  2. 说一说自己对于 synchronized 关键字的理解 ?
synchronized关键字用来解决多线程之间资源的同步性的,synchronized保证修饰的方法和同步代码块任意时刻只有一个执行
底层是通过monitor实现的,通过monitorEnter获取锁,monitorExit释放锁
  1. 讲一下 synchronized 关键字的底层原理 ?
synchronized是通过monitorenter和monitorexit指令实现了,monitor是对象的同步基本单元
java6前,monitor是互斥锁;java6后,提供了三种不同的monitor实现(偏向锁、轻量级锁、重量级锁)
  1. 说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优 化吗?
jdk1.6后对于锁引入了大量的优化,偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除和锁粗化来减少锁的开销
    偏向锁:在无竞争的情况下完全消除同步块
    轻量级锁:使用轻量级锁时,不需要申请互斥量,加锁和解锁都使用了CAS操作(在无竞争的情况下使用CAS代替互斥量)
    自旋锁:循环去判断资源是否可用,消耗cpu
    适应性自旋:自旋的次数不固定,由上一次同一个锁自旋次数和拥有者状态决定
    锁消除:去除不可能存在共享资源竞争的锁
        锁粗化:扩大加锁范围,避免反复加锁和解锁(比如对一个循环操作进行加锁解锁)
    锁的四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态
http://m.mianshigee.com/question/10025hlk
  1. 谈谈 synchronized和ReenTrantLock 的区别?
synchronized是jvm层面的(monitor实现的),ReentrantLock是JUC下的一个类
synchronized不需要主动释放锁,ReentrantLock需要lock-unlock结合try-finally结合主动释放锁
synchronized是非公平锁,ReentrantLock是可以根据传入的boolean值选择
synchronized不可中断,ReentrantLock是可以通过tryLock中断的

  1. 说说 synchronized 关键字和 volatile 关键字的区别?
volatile修饰变量,synchronized修饰类、方法、变量
volatile可以保证可见性、不能保证原子性;synchronized两个都可以
volatile不会造成线程阻塞,synchronized会阻塞
  1. 为什么要用线程池
降低资源的消耗。通过反复利用创建的线程降低线程创建和销毁造成的销毁消耗
提高响应速度。当任务到达时就可以立刻执行不需要等待线程创建
提高线程的管理性 
  1. 实现Runnable接口和Callable接口的区别?
Runnable实现的是run方法,Callable实现的是call方法
Callable能抛异常、能有返回值
  1. 执行execute()方法和submit()方法的区别是什么呢?
execute:传入Runnable接口
submit:
    可传入Runnable,也可以传入Callable接口
    可以返回future,可以通过get()获取返回值;
  1. 如何创建线程池 ?
可以通过Executors的四个静态类创建
但是阿里巴巴手册上推荐我们自定义:ThreadPoolExecutor
    因为可能会导致OOM
    Fixed和Single的请求队列定义最大长度为Integer.MAX_VALUE,可能会导致任务大量堆积
    Cached和Schedule允许创建线程的最大数量是Integer.MAX_VALUE,可能会创建大量线程
  1. 介绍一下Atomic 原子类?
原子类表示的是具有原子特征的类,也就是说多个线程执行的时候,一个操作一旦开始,就不会被其他线程干扰。
原子类java.util.concurrent,原子类分为四类:
    基本类型:AtomiInteger/AtomicLong/AtomicBoolean
    数组类型:
    引用类型:AtomicReference
    对象属性修改类型:AtomicStampedReference
  1. JUC 包中的原子类是哪4类?
讲讲 AtomicInteger 的使用?
AtomicInteger
#getAndIncrement
#getAndDecrement
#getAndSet
#getAndAdd
#CompareAndSet
  1. 能不能给我简单介绍一下 AtomicInteger 类的原理 ?
主要通过CAS+volatile+native方法保证原子性的
CAS:拿期望值和原有值做一个比较,如果相同则更新
UnSafe.objectFieldOffset是一个本地方法:拿到原来值的内存地址
AtomicInteger的value值是用volatile修饰的
  1. AQS 介绍 ?
AQS全称是AbstractQueuedSynchronizer,这个类在java.util.concurrent.locks包下的
AQS是一个构建锁和同步器的框架
    使用AQS能够高效的构建出应用广泛的大量同步器,如ReentrantLock,Semaphone,ReentrantReadWriteLock,FutureTask
    也可以使用AQS自定义实现需要的同步器
  1. AQS 原理分析 ?
如果被请求的共享资源空闲
    则进行两个操作:1.请求资源的线程设置为有效的工作线程。2.设置资源为锁定状态
如果不空闲
    通过CLH队列实现:线程阻塞等待和唤醒时锁分配机制,将获取不到锁的线程加入到队列中
AQS使用一个int的成员变量表示同步状态,通过阻塞队列实现获取资源的排队工作,使用CAS原子操作实现对值的修改
  1. 多线程其他
synchronized 关键字:① 说一说自己对于 synchronized 关键字的了解;② 说说自己是怎么使用 synchronized 关键字,在项目中用到了吗;③ 讲一下 synchronized 关键字的底层原理;④ 说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗;⑤ 谈谈 synchronized 和 ReentrantLock 的区别。
volatile 关键字: ① 讲一下 Java 内存模型;② 说说 synchronized 关键字和 volatile 关键字的区别。
ThreadLocal:① 简介;② 原理;③ 内存泄露问题。
线程池:① 为什么要用线程池?;② 实现 Runnable 接口和 Callable 接口的区别;③ 执行 execute() 方法和 submit() 方法的区别是什么呢?;④ 如何创建线程池。
Atomic 原子类: ① 介绍一下 Atomic 原子类;② JUC 包中的原子类是哪 4 类?;③ 讲讲 AtomicInteger 的使用;④ 能不能给我简单介绍一下 AtomicInteger 类的原理。
AQS :① 简介;② 原理;③ AQS 常用组件。
简述线程、程序、进程的基本概念。以及他们之间关系是什么?==http://m.mianshigee.com/question/10077uia
线程有哪些基本状态?==http://m.mianshigee.com/question/10078xdc
解释一下什么是池化设计思想。什么是数据库连接池?为什么需要数据库连接池?==http://m.mianshigee.com/question/10120pwo
讲一下volatile涉及的Java内存模型?==http://m.mianshigee.com/question/10144msa
请介绍一下ThreadLocal?==http://m.mianshigee.com/question/10145xcu
请说一下ThreadLocal的原理?==http://m.mianshigee.com/question/10146ygf
ThreadLocal 内存泄露问题?==http://m.mianshigee.com/question/10147exw
请介绍一下 ThreadPoolExecutor 类?==http://m.mianshigee.com/question/10148hgy
ThreadPoolExecutor 构造函数重要参数分析?==http://m.mianshigee.com/question/10149tfa
ThreadPoolExecutor 饱和策略?==http://m.mianshigee.com/question/10150vgo
ThreadPoolExecutor 创建方法最佳实践?==http://m.mianshigee.com/question/10151ccw
说说并发与并行的区别?==http://m.mianshigee.com/question/10155exo
为什么要使用多线程?==http://m.mianshigee.com/question/10156wet
使用多线程可能带来的问题?==http://m.mianshigee.com/question/10157bqv
说说线程的生命周期和状态?==http://m.mianshigee.com/question/10158fah
说说线程优先级?==http://m.mianshigee.com/question/10159tvo
守护线程和用户线程的区别?==http://m.mianshigee.com/question/10160sfm
什么是上下文切换?==http://m.mianshigee.com/question/10161ise
什么是线程死锁?如何避免死锁?==http://m.mianshigee.com/question/10162ant
守护线程是什么?==http://m.mianshigee.com/question/10434qoy
Java 多线程有几种实现方式?==http://m.mianshigee.com/question/10435iih
sleep() 和 wait() 有什么区别?==http://m.mianshigee.com/question/10436nqc
notify()和 notifyAll()有什么区别?==http://m.mianshigee.com/question/10437lcv
线程的 run() 和 start() 有什么区别?==http://m.mianshigee.com/question/10438gcn
创建线程池有哪几种方式?==http://m.mianshigee.com/question/10439vql
线程池都有哪些状态?==http://m.mianshigee.com/question/10440eod
在 Java 程序中怎么保证多线程的运行安全?==http://m.mianshigee.com/question/10441jgu
在 Java 程序中怎么保证多线程的运行安全?==http://m.mianshigee.com/question/10442cel
多线程中 synchronized 锁升级的原理是什么?==http://m.mianshigee.com/question/10443qdm
怎么防止死锁?==http://m.mianshigee.com/question/10444gvq
ThreadLocal 是什么?有哪些使用场景?==http://m.mianshigee.com/question/10445nuy
synchronized 和 Lock 有什么区别?==http://m.mianshigee.com/question/10446nqo

四、Spring

  1. Spring-事务,事务传播
  2. 如果存在A依赖B,B依赖A,那么是怎么加到IOC中去的
  3. beanFactory的理解,怎么加载bean
  4. FactoryBean的理解
  5. bean的生命周期
  6. spring中的自动装配方式
  7. BeanFactory 和 FactoryBean
  8. Spring IOC 的理解,其初始化过程?
  9. BeanFactory 和 ApplicationContext?
  10. Spring Bean 的生命周期,如何被管理的?Spring Bean 的加载过程是怎样的?
  11. Spring 中用到了那些设计模式?
  12. Spring 循环注入的原理?
  13. Spring 如何保证 Controller 并发的安全?
  14. springmvc的运行机制,dispatch -> hanldermapping-—>handler ->handlerAdapter->执行handler->modelandview -> 返回mv -> 视图解析器->返回view -> 渲染响应

五、JVM

  1. JVM内存模型
脑海里要有JVM内存图
1)JVM栈
	栈由栈帧组成;
	栈帧就相当于方法,栈帧由局部变量表(存放基本数据和引用)、操作数栈(存放等号右边零时变量)、动态链接、方法出口(记录下一个栈帧位置)组成
2)本地方法栈
	调用本地方法,也就是native修饰的方法
3)程序计数器
	为了调度,程序挂起后,恢复继续执行
4)方法区
	存放常量/静态变量/类结构信息
5)堆
	分为新生代和老年代==>1:2;新生代分为Eden+S1+S2==>8:1:1
	GC可达性分析:GCroot对象不可达的对象可以被垃圾回收;两种垃圾回收==>minor GC和Full GC
	可作为GC root的对象:栈中引用的对象;方法区的常量和静态变量;
  1. Java 对象的创建过程?
类加载检查
    new指令,检查参数是否能在常量池中定位到这个符号引用
    检查这个符号引用代表的类是否被加载、解析和初始化过==>如果没有就执行类加载过程
分配内存
    在堆中划分确定的内存分配
    分配的方式:指针碰撞和空闲列表(是否规则决定,GC收集器有没有压缩整理功能决定)
初始化0值
    保证类中的成员变量不赋初值零值也能够直接用
设置对象头
    对象头会设置 锁的状态信息;hashCode;GC分代年龄等
执行init方法
http://m.mianshigee.com/question/10043rbu
  1. 对象的访问定位的两种方式
句柄和直接指针
句柄:
    句柄池(堆中)存着具体的地址
直接指针:
    指针指向具体的数值
  1. 如何判断对象是否死亡(两种方法)?
引用计数法
    引用计数器,一个引用+1;失效引用-1;为0就被回收
    但是不用它,因为有循环引用问题,永远不会被回收
可达性分析
    用GC roots对象作为起点,向下遍历的对象都可用,没有遍历到的都失效
    GC roots对象:
        Java栈中的引用对象
        方法区中静态和常量引用的对象
        本地方法区中引用的对象
  1. 介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)?
http://m.mianshigee.com/question/10046wsa
强引用:死(OOM)也不回收
软引用:空间不足才回收
弱引用:执行垃圾回收机制就回收;ThreadLocalMap中的key值(ThreadLocal)就是弱引用
虚引用:
    虚假的,不决定生命周期,任何时候都可能被回收
    主要是用来跟踪对象垃圾回收的活动;一般和引用队列一起使用
引用队列:回收之前会放入队列中执行,类似于后置通知
  1. 如何判断一个常量是废弃常量 ?
没有对象引用的常量就是废弃常量;回收的话会被清理出常量池
  1. 如何判断一个类是无用的类?
满足三个条件就“可以”被回收
    1.堆中不存在该类的任何实例
    2.该类的ClassLoader已经被回收
    3.该类对应的java.lang.Class对象没有被任何地方引用,无法通过反射访问该类的方法
  1. Java垃圾收集有哪些算法,各自的特点?
复制算法:分成两个大小相等的内存区域,当用完一块的时候将活着的对象复制在另
标记清除
标记整理
分代算法
http://m.mianshigee.com/question/10049vbx
  1. HotSpot为什么要分为新生代和老年代?
1.新生代由Eden区和s1、s2组成
每次使用空间不超过90%,主要用来存放新生对象
Minor GC主要发生在新生代,采用复制算法,每次收集后Eden区和survivor区要被清空一块
2.老年代使用Full GC,采用的标记-清除算法
  1. 常见的垃圾回收器有那些?
Serial:
    单线程
    STW
    -XX:+UseSerial GC后,会配合Serial old使用。新生代:复制算法,老年代:标记整理算法
ParNew:serial的多线程版本
    多线程
    STW
    -XX:+UserParNewGC后,会配合serial old使用
Parallel
    追求的是高吞吐量,并行的新生代收集器
    会配合Parallel Old使用
Serial old:
    可作为CMS的后备方式    
Parallel old
    Parallel的老年代收集器
CMS:并发标记清除
    追求的是最短停顿时间,没有STW
    +UseConcMarkSweepGC,ParNew+CMS+Serial Old使用
G1
  1. 如何选择垃圾收集器?
单核cpu或者小内存:+UseSerialGC===单机程序
多核cpu,需要最大吞吐量:+UseParallerGC/UseParalleOldGC==后台计算型应用
多核cpu,追求低停顿时间:+UseConcMarkSweepGC/+ParNewGC==高响应的互联网应用
  1. 介绍一下CMS,G1收集器?
CMS:
    追求的是最短回收停顿时间,它是第一次实现用户线程和垃圾回收线程时工作的收集器
    算法:标记清除算法
    步骤:初始标记(GC root)--并发标记(可达性分析)--重新标记(保证用户线程继续运行导致的变化)--并发清除
    优缺点:
        优点:并发收集、低停顿
        缺点:标记清除算法会产生大量碎片;无法清除浮动垃圾;对cpu资源敏感
G1:
    思想:将内存化整为零,将堆分成很多小块,整体上用“标记整理算法”,局部用的是复制算法
   既满足停顿时间要求,又具备高吞吐量
   步骤:初始标记--并发标记--最终标记--筛选回收
   优点:低停顿、高吞吐量、不会有碎片
  1. Minor Gc和Full GC 有什么不同呢?
Minor GC:新生代
Full GC:又叫major Gc发生老年代,出现Full GC经常伴随着至少一次Minor GC

六、Mysql

  • 事务四大特性(ACID)原子性、一致性、隔离性、持久性?
  • 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?
  • MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?
  • MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?
  • 查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序
  • 索引为什么要用B+树,B+树和B-树的区别是什么
  • mysql锁,行锁,表锁 ,什么时候发生锁,怎么锁,原理
  • 数据库优化,最左原则啊,水平分表,垂直分表
  • MySQL B+Tree索引和Hash索引的区别?
  • sql查询语句确定创建哪种类型的索引?如何优化查询?
  • 聚集索引和非聚集索引区别?
  • 有哪些锁(乐观锁悲观锁),select 时怎么加排它锁?
  • 使用explain优化sql和索引?
  • MySQL慢查询怎么解决?
  • 什么是 内连接、外连接、交叉连接、笛卡尔积等?
  • mysql都有什么锁,死锁判定原理和具体场景,死锁怎么解决?
  • varchar和char的使用场景?

其他

  1. 怎么防止表单重复提交
前端:提交完置为只读(有风险)
后端:缓存判断
	HashMap
	循环数组
	LRUMap
  1. 没整理出来分类和答案的
讲一讲集合框架整体框架
ArrayList和HashSet的区别
为什么HashMap要在8的时候树化:泊松分布概率(源代码注释)
HashMap线程安全的方式:Hashtable和ConcurrentHashMap的各自特点,能讲多深就多深
为什么Hashtable被弃用了,jdk7和8的区别
锁的分类:乐观、悲观、自旋、读写、分段锁
Spring IOC底层实现:xml+dom4j+工厂+单例
索引不适用的条件:索引列上有函数、不满足最最前缀、使用了不等号、使用了范围查询
索引分类:B-Tree索引、Hash索引、全文索引、单值索引、唯一索引、复合索引、聚簇、非聚簇
线程池了解多少:executors创建、ThreadPoolExecutor的七个参数
拒绝策略分别使用在什么场景
Spring AOP底层实现:动态代理,newProxyInstance,cglib,ASM
讲一下代理模式:动态代理和静态代理
你都了解什么设计模式,在JDK中怎么体现
千万级别的数据量的list找一个数据(多线程)
讲一下JVM堆内存管理:
	栈上分配->TLAB->新生代、老年代->可达性分析->GC算法->所有垃圾回收器及其优缺点
到底多大的对象会直接被扔进老年区
G1有两个region不是连续,而且之间有可达引用,我现在要回收一个,另一个会被怎么处理
听说过CMS的并发预处理和并发可中断预处理
平时怎么学习和职业规划
百万级int数据量的一个Array求和(fork/join)
synchronized和reentrantLock底层实现以及重入的底层原理:
	moniter AQS,重入原理:entry,count,state
锁的四种状态和升级过程
CMS和G1的异同
G1什么时候会引发full GC
除了CAS,原子类,syn,lock还有什么是线程安全的方式 (final)
HashMap和Hashtable有什么区别
允许null键的map你知道哪些:HashMap,LinkedHashMap,weakHashMap
null键放在HashMap的哪里:底层数组的0号位置
为什么Hashtable的扩容是2倍+1:从除留余数法,初始容量方面回答
红黑树的插入时间复杂度
解决哈希冲突的方式
现在有1T数据,内存只有1G,该怎么对他们进行排序:多路归并
Tomcat为啥要重写类加载器
TCP握手挥手及其状态转换
mysql的隔离级别
B树和B+树的区别
Java运行时数据区
说一个你最熟悉的垃圾回收算法
吞吐量优先和响应时间优先的回收器是哪些:parallel scavenge和CMS
类加载全过程
线程池7个参数
ConcurrentHashMap底层原理
手写一个LRU:LinkedHashMaP
HashMap为啥不用AVL树,而用红黑树
为什么8就变成树了,为什么6的时候退回成链表
线程池的7个参数怎么配置最好
说一下volatile
volatile的可见性和禁止指令重排怎么实现的: 
	可见性是缓存一致性协议;
	禁止指令重排:JMM里面有8个指令完成数据读写,通过其中load和store指令相互组合成四个内存	屏障实现的
CAS是什么
PriorityQueue底层是什么,初始容量是多少,扩容呢
HashMap为啥容量要设计成2的幂次
你知道跳表吗,什么场景会用到 ?  
	ConcurrentSkipListMap 在多线程下需要自定义排序顺序时
CopyOnwriteArrayList知道吗,迭代器支持fail-fast吗?  
	线程安全ArrayList写时复制,迭代器是采用快照风格,不支持fail-fast
innodb底层数据结构
为什么用B+树不用B树
为什么用B+树不用红黑树
线程池的设计体现了什么设计模式
知道责任链设计模式吗
wait/notify体现了什么设计模式
Spring事务传播
IOC底层原理
怎么判断内存泄露
怎么在日志里排除错误,该用哪些Linux命令
MySQL原子性和持久性怎么得到保证的?  undolog redolog
怎么解决幻读   MVCC+间隙锁
innodb和myisam区别
对象创建过程
对象在内存中的存储布局:对象头,类元指针,实例数据,对其填充
对象头具体包括什么
对象怎么定位:直接指针,句柄
堆怎么划分
对象怎么分配 : 栈上分配-TLAB-new-old
具体讲一下CMS流程
锁的四种状态
Object obj = new Object()这句话在内存中占用了多少内存 :引用变量48byte,对象头18byte,对齐填	充增量16byte,一共20Byte
Synchronized和ReentrantLock的异同
你怎么看待接口和抽象类
主键索引设计应该采用B-tree索引还是hash索引
设计模式说5,6个
说一下你了解的MQ
你对高并发的理解,会从什么角度设计高并发程序
JUC包里面限流是怎么做到的   : Semaphore和guava ratelimiter
索引不适用的条件
说一下NIO和AIO
AIO里面设计模式:观察者模式
说一下select,poll,epoll
线程池中 CachedThreadPool里面用的是什么阻塞队列:SYnchronousQueue
那你知道LinkedTransferQueue和SynchronousQueue有什么区别吗
你还知道什么阻塞队列,能具体说说他们的特点吗?
线程池的线程数怎么设置比较好
CAS的ABA问题怎么解决
Java内存模型:JMM共享内存模式以及8个原子操作指令
什么叫做阻塞队列的有界和无界
cookie和session:splash
说一下反射,反射会影响性能吗
谈一下AQS:
为什么你说AQS底层是CAS+volatile: 
	state是volatile修饰的,并且state的方法除了setState,还有CompareAndSetState
JUC包里面同步组件主要实现了AQS的哪些主要方法
	tryAcquire
	tryRelease
	tryAcquireShared
	tryReleaseShared
	isHeldExclisovely
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值