Java面试题

 

多线程

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..

其他

强引用、软引用、弱引用、幻想引用有什么区别?

 

持续更新中。。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值