首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
首页 /
java原理
#
java原理
#
9784次浏览
44人互动
收藏话题
分享
此刻你想和大家分享什么
热门
最新
03-06 14:46
郑州大学 Java
Java中的定时任务
在Java中,主要有两种方式实现定时任务:使用java.util包中的Timer和TimerTask。使用Java并发包中的ScheduledExecutorService。Timer和TimerTaskTimerTask:表示一个定时任务,它是一个抽象类,实现了Runnable,具体的定时任务需要继承该类,实现run方法。Timer是一个具体类,它负责定时任务的调度和执行运行一次: //在指定绝对时间time运行任务task public void schedule(TimerTask task, Date time) //在当前时间延时delay毫秒后运行任务task public voi...
Java知识专辑
点赞
评论
收藏
分享
03-06 13:33
郑州大学 Java
ConcurrentHashMap会ConcurrentModificationException吗
ConcurrentHashMap有ConcurrentModificationException的问题吗?迭代会反映其他线程的修改吗?还是反映的是创建时的副本?
查看3道真题和解析
点赞
评论
收藏
分享
03-06 18:08
郑州大学 Java
下面这段代码有什么问题?
new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { //do some things } }, new Date(去年某个时间), 1000);
Java面试专辑
点赞
评论
收藏
分享
03-06 14:09
郑州大学 Java
线程池的使用说明
线程池主要由两个概念组成:一个是任务队列;另一个是工作者线程。工作者线程主体就是一个循环,循环从队列中接受任务并执行,任务队列保存待执行的任务。ThreadPoolExecutor继承自AbstractExecutorService,实现了ExecutorService。ThreadPoolExecutor实现了生产者/消费者模式,工作者线程就是消费者,任务提交者就是生产者,线程池自己维护任务队列。当我们碰到类似生产者/消费者问题时,应该优先考虑直接使用线程池,而非“重新发明轮子”,应自己管理和维护消费者线程及任务队列。两个构造函数 public ThreadPoolExecutor(int ...
Java知识专辑
点赞
评论
收藏
分享
03-06 12:13
已编辑
郑州大学 Java
中断的本质
在Java中,停止一个线程的主要机制是中断,中断并不是强迫终止一个线程,它是一种协作机制,是给线程传递一个取消信号,但是由线程来决定如何以及何时退出。 public boolean isInterrupted() public void interrupt() public static boolean interrupted() 每个线程都有一个标志位,表示该线程是否被中断了。isInterrupted:返回对应线程的中断标志位是否为true。interrupted:返回当前线程的中断标志位是否为true,但它还有一个重要的副作用,就是清空中断标志位,也就是说,连续两次调用interrupt...
Java知识专辑
点赞
评论
收藏
分享
03-06 18:30
郑州大学 Java
ThreadLocal是如何使用弱引用的?为什么要使用弱引用?
假设 ThreadLocalMap 中的 Key(即 ThreadLocal 对象)是强引用,在一个方法内部创建了一个 ThreadLocal,用完之后,方法结束了,你希望这个 ThreadLocal 对象被回收。问题是 虽然代码中不再引用创建ThreadLocal时的 变量(强引用断开),但当前线程(通常是线程池中的核心线程,生命周期极长)的 ThreadLocalMap 依然持有 ThreadLocal 的另一个强引用。只要线程不挂,ThreadLocal 对象就永远无法被 GC 回收。这就是 Key 的内存泄漏。所以为了保证当外界不再使用 ThreadLocal 对象时,它能被 GC 正...
Java面试专辑
点赞
评论
收藏
分享
03-06 18:21
郑州大学 Java
线程协作机制
Java中多个线程之间如果需要协同工作,需要下面工具进行协同。我们分别来介绍下每个工具的作用和使用注意点。读写锁ReentrantReadWriteLock多个线程的读操作完全可以并行,在读多写少的场景中,让读操作并行可以明显提高性能,此时我们可以使用读写锁。在Java并发包中,接口ReadWriteLock表示读写锁: public interface ReadWriteLock { Lock readLock(); Lock writeLock(); } 写锁:只有一个线程可以进行写操作:在获取写锁时,只有没有任何线程持有任何锁才可以获取到;在持有写锁时,其他任何线程都获取不到任何锁。读锁...
Java知识专辑
点赞
评论
收藏
分享
03-05 15:09
已编辑
郑州大学 Java
类和对象的创建及使用原理
先看一个例子: public class Base { public static int s; private int a; static { System.out.println("基类静态代码块, s: " + s); s = 1; } { System.out.println("基类实例代码块, a: " + a); a = 1; } public Base() { System.out.println("基类构造方法, a: " + a); a = 2; } protected void step() { System.ou...
帮你内推|拼多多集团-PDD 实习
点赞
评论
收藏
分享
03-08 12:28
郑州大学 Java
组合式异步编程
使用场景有一定依赖关系的异步任务。简单介绍CompletableFuture,它是一个具体的类,实现了两个接口,一个是Future,另一个是CompletionStage。Future表示异步任务的结果,而CompletionStage的字面意思是完成阶段。多个CompletionStage可以以流水线的方式组合起来,对于其中一个CompletionStage,它有一个计算任务,但可能需要等待其他一个或多个阶段完成才能开始,它完成后,可能会触发其他阶段开始运行。CompletionStage提供了大量方法,使用它们,可以方便地响应任务事件,构建任务流水线,实现组合式异步编程。使用Future,...
Java知识专辑
点赞
评论
收藏
分享
03-08 12:21
郑州大学 Java
下面的filter()和map()都需要对流中的每个元素操作一次,一起使用对数据遍历一次还是两次?
List<String> above90Names = students.stream() .filter(t->t.getScore()>90).map(Student::getName) .collect(Collectors.toList());
Java面试专辑
点赞
评论
收藏
分享
03-06 14:18
已编辑
郑州大学 Java
很多人这么用了但不知道这里有问题,你能看出来问题在哪里吗?
new ThreadPoolExecutor(2, 16, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
Java面试专辑
点赞
评论
收藏
分享
03-05 16:58
郑州大学 Java
多个线程操作相同变量时存在两个问题
一、竞态条件当多个线程访问和操作同一个对象时,最终执行结果与执行时序有关,可能正确也可能不正确。比如一个static int counter在多个线程中++时,每次输出的结果都不一样。因为counter++这个操作不是原子操作,它分为三个步骤:取counter的当前值;在当前值基础上加1;将新值重新赋值给counter。两个线程可能同时执行第一步,取到了相同的counter值,比如都取到了100,第一个线程执行完后counter变为101,而第二个线程执行完后还是101,最终的结果就与期望不符。二、内存可见性多个线程可以共享访问和操作相同的变量,但一个线程对一个共享变量的修改,另一个线程不一定...
Java知识专辑
点赞
评论
收藏
分享
03-08 12:18
郑州大学 Java
Stream中的数据处理
接口Stream类似于一个迭代器,但提供了更为丰富的操作,Stream API的主要操作就定义在该接口中。Java 8给Collection接口增加了两个默认方法,它们可以返回一个Stream,如下所示: default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } default Stream<E> parallelStream() { return StreamSupport.stream(spliterator(), true); } stream()返回的是一个...
Java知识专辑
点赞
评论
收藏
分享
03-20 15:27
郑州大学 Java
接口和抽象类
接口抽象类为什么需求很多时候,我们实际上关心的,并不是对象的类型,而是对象的能力,只要能提供这个能力,类型并不重要。比如要拍照,很多时候,只要能拍出符合需求的照片就行,至于是用手机拍,还是用Pad拍,或者是用单反相机拍,并不重要,即关心的是对象是否有拍出照片的能力,而并不关心对象到底是什么类型,手机、Pad或单反相机都可以。这种情况下,类型并不重要,重要的是能力。那如何表示能力呢?接口。接口这个概念在生活中并不陌生,电子世界中一个常见的接口就是USB接口。计算机往往有多个USB接口,可以插各种USB设备,如键盘、鼠标、U盘、摄像头、手机等。接口声明了一组能力,但它自己并没有实现这个能力,它只是...
Java知识专辑
点赞
评论
收藏
分享
03-06 18:14
郑州大学 Java
Timer有什么明显的缺点?
如果其中一个任务是无限循环,其他任务可能永远没有机会执行。如果其中一个任务run方法一旦抛出异常,Timer线程就会退出,从而所有定时任务都会被取消。
Java面试专辑
点赞
评论
收藏
分享
03-06 12:43
郑州大学 Java
并发容器的实现
Java中常用的几个并发容器容器实现使用场景CopyOnWriteArrayList内部是一个数组,这个数组是以原子方式被整体更新的。写:每次修改操作,都会新建一个数组,复制原数组的内容到新数组,在新数组上进行需要的修改,然后以原子方式设置内部的数组引用,这就是写时复制。多个线程不能同时写,每个写操作都需要先获取锁。CopyOnWriteArrayList内部使用ReentrantLock。读:先拿到当前引用的数组,然后直接访问该数组。在读的过程中,可能内部的数组引用已经被修改了,但不会影响读操作,它依旧访问原数组内容。读不需要锁,可以并行,读和写也可以并行。CopyOnWriteArrayL...
Java知识专辑
点赞
评论
收藏
分享
03-08 12:14
郑州大学 Java
Supplier的使用场景有哪些?
一、延迟执行:在需要时才计算结果,常用于日志、缓存或条件判断 logIfEnabled(() -> heavyComputation()); void logIfEnabled(Supplier<String> msgSupplier) { if (isLogEnabled()) { System.out.println(msgSupplier.get()); } } 二、工厂模式的替代传统写法: public interface Factory<T> { T create(); } 完全可以用 Supplier<T> 取代: Supplier<...
Java面试专辑
点赞
评论
收藏
分享
03-08 12:10
郑州大学 Java
Lambda表达式
外部变量访问与匿名内部类类似,Lambda表达式也可以访问定义在主体代码外部的变量,但对于局部变量,它也只能访问final类型的变量,与匿名内部类的区别是,它不要求变量声明为final,但变量事实上不能被重新赋值。比如String msg = "hello world"; executor.submit(()->System.out.println(msg));可以访问局部变量msg,但msg不能被重新赋值,如果这样写就会报错: String msg = "hello world"; msg = "good morning"; ...
Java知识专辑
点赞
评论
收藏
分享
03-06 13:47
郑州大学 Java
异步任务是如何运转的
任务执行服务涉及的基本接口:Runnable和Callable:表示要执行的异步任务。Runnable没有返回结果,而Callable有,Runnable不会抛出异常,而Callable会。Executor和ExecutorService:表示执行服务。Future:表示异步任务的结果。Runnable、Callable @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * ...
Java知识专辑
点赞
评论
收藏
分享
03-06 10:56
郑州大学 Java
synchronized的使用
每个Object对象都有一把锁和等待队列,一个线程在进入synchronized代码块时,会尝试获取锁,如果获取不到则会把当前线程加入等待队列中。执行synchronized的过程大致如下:尝试获得锁,如果能够获得锁,继续下一步,否则加入等待队列,阻塞并等待唤醒。执行实例方法体代码。释放锁,如果等待队列上有等待的线程,从中取一个并唤醒,如果有多个等待的线程,唤醒哪一个是不一定的,不保证公平性。当前线程不能获得锁的时候,它会加入等待队列等待,线程的状态会变为BLOCKED。synchronized保护的是对象而非代码,只要访问的是同一个对象的synchronized方法,即使是不同的代码,也会被...
Java知识专辑
点赞
评论
收藏
分享
玩命加载中
创作者周榜
更多
热议话题
更多
1
...
你的实习产出是真实的还是包装的?
0
2
...
第一份工作应该选择高薪还是大平台
0
1
...
华泰星战营,提前锁定校招offer
3
...
考公VS就业,你怎么选?
0
4
...
卷__卷不过你们,只能卷__了
0
5
...
商战,最累的是我们
0
6
...
小红书求职进展汇总
0
7
...
校招第一份工作你干了多久?
0
8
...
大疆求职进展汇总
0
9
...
哪些公司对双非友好
0
10
...
AI时代还有必要刷leetcode吗?
0
牛客网
牛客网在线编程
牛客网题解
牛客企业服务