多线程
1. 线程和进程有什么区别
进程是表示资源分配的基本单位,又是调度运行的基本单位
线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位
1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
(4)处理机分给线程,即真正在处理机上运行的是线程。
(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。
2. 实现线程的几种方法
有四种方法
1)继承Thread
2) 实现Runnnable接口
3) Callable FutureTask来实现线程
FutureTask在调用get时,方法会阻塞, 直到任务返回结果,后面的代码才会执行
4)使用线程池方法 : 用ExecutorService、Callable、Future实现有返回结果的线程
https://blog.csdn.net/u011517841/article/details/81984719
3. Java 中 sleep 方法和 wait 方法的区别
1)sleep是是属于Thread类的,wait是属于Object类的
2)在调用sleep()方法的过程中,线程不会释放锁,而wait方法释放了锁,前提条件是它已经持有锁。所以wait和notify(或者notifyAll)方法都必须被包裹在synchronized语句块
3)sleep()需要捕获异常, wait不需要
因为Thread.sleep()是让线程休眠。在这种睡眠状态下,你可能调用interrupte来终止线程,这样就会抛出InterruptException,只有捕获异常进行处理,才能正确的终止线程。
4. synchronized 修饰static方法,具体锁的是什么
类锁,但是其实锁的还是对象, 比如类 Student.锁的是Student.class对象
5. Java中Runnable和Callable有什么不同
1)Callable规定的方法是call(),Runnable规定的方法是run()
2)call方法可以抛出异常,run方法不可以
3)Callable可以获取返回结果, 可以判断任务是否完成,可以终端任务, 可以查看任务是否完成
6. JAVA volitile关键字有什么用
保证线程并发时,保证数据的可见性以及有序性,但不能保证数据的原子性
用volitile修饰的数据,保证从主内存(物理内存)中读取数据/写入数据, 而不是从工作内存(缓存)中读取写入数据。
不用volitile 修饰的数据,工作内存中的数据并不是及时的写入主内存中的,这样就会导致脏数据, 也就是不能保证可见性。
https://blog.csdn.net/u011517841/article/details/79894333
7. Java中CAS原理是什么意思,有哪些应用
CAS:
Compare and Swap 比较而且交换
可以理解为乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。Compare and Swap
应用:automic包
8. Java中Volatile和Synchronized不同点是什么
1)粒度不同,前者针对变量 ,后者锁对象和类
2)syn阻塞,volatile线程不阻塞
3 )syn保证三大特性:可见性,原子性,有序性,volatile不保证原子性,只能保证可见性,有序性(防止重排)。
9 什么叫竞态条件?
当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件,使用同步就可以减少竞态
10. Java中Executors的作用
11.CountDownLatch和CyclicBarrier的区别
CyclicBarrier 回环栅栏,就比如假设有只有的一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待. 功能如下图所示。
CountDownLatch 线程计数器 线程完成一个就记一个(递减),等所有线程执行完再执行下面的操作
https://blog.csdn.net/u011517841/article/details/82149493
12. ReentrantLock和synchronized关键字有什么区别
在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized
区别:
1. ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。
2. ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
3. ReenTrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。
4. Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的.synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁
https://blog.csdn.net/qq838642798/article/details/65441415
13. Java各种锁的理解
https://blog.csdn.net/u011517841/article/details/82180927
14. 如何控制某个方法允许并发访问线程的个数
使用信号量Semaphore https://blog.csdn.net/u011517841/article/details/82181737
Java集合
1.HashMap的实现原理,什么是hash碰撞,怎样解决hash碰撞?
HashMap存放的原理: 先查看对象的hashcode是否相同, 如果不同, 存放在不同的散列表里(即不同的数组下标里),如果hashcode相同,就会比较两个对象是否equals,如果equals,覆盖之前的值, 如果不equals,存放在以该hashcode为头链表的单链表的下一个节点中
hashcode碰撞,意思为HashCode一样, 这种情况,就是使用拉链法(即单链表)解决, Java1.8以后如果链表长度大于8,链表将转换为红黑树
https://blog.csdn.net/u011517841/article/details/77648861
2.ConcurrentHashMap的原理,与HashTable的区别?
区别:https://blog.csdn.net/u011517841/article/details/77744430
3.HashSet和TreeSet的区别以及底层实现原理
区别:https://blog.csdn.net/u011517841/article/details/82381389
4.HashMap中存key-value,value有重复但是都是Comparable类型可比较;怎样根据value排序此集合,介绍实现方法
Java JVM
1. JVM类加载过程
JVM加载过程: 加载,连接(验证,准备, 解析),初始化,使用,卸载
1)类加载, 类的加载指的是将类的.class文件中的二进制数据读入到内存中 即查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
对应源码中的方法:CLassLoader类中的loadCLass方法, 使用双亲委派模式原则
2) 连接
验证: 验证被加载的类是否有正确的内部结构
准备: 为类变量准备内存,设置默认值
解析:解析类和其他类之间的关系, ClassLoader.loadCLass.findClass 中调用resolveClass来解析
3) 初始化: 按照类中的书写顺序, 给类变量赋值,
方式为:
A: 设定初始值 public static int a = 7;
B: 静态代码块
{
a = 10;
}
https://blog.csdn.net/u011517841/article/details/80012499
2. Java执行顺序
https://blog.csdn.net/u011517841/article/details/82657047
https://blog.csdn.net/u011517841/article/details/82662155
3. JVM内存结果
2. 内存溢出可能原因和解决
Java 基础
1. 可变长度参数列表 String..
其他
持续更新中。。