首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
首页 /
并发编程
#
并发编程
#
7905次浏览
70人互动
收藏话题
分享
此刻你想和大家分享什么
热门
最新
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知识专辑
点赞
评论
收藏
分享
2025-01-08 21:04
深圳大学 测试开发
Java 八股文:JUC 篇
5 - JUC 篇 5.1 线程基础 5.1.1 进程、线程与协程? 概念: 进程:程序执行的独立实例,拥有自己的内存空间。有多个状态,如运行、等待、就绪和终止。 线程:进程中的一个实体,是CPU调度的最小单位。同一进程的线程共享进程资源,如内存。 协程:轻量级线程,用于非阻塞的异步编程。可以在等待操作时挂起,节省资源,提高效率。 区别: 进程是正在运行程序的 实例,进程中包含了线程,每个线程执行不同的 任务。 不同的进程使用 不同 的内存空间,在当前进程下的所有线程可以 共享 内存空间。 线程比进程更轻量,线程上下文切换成本一般上要比进程上下文切换低。 协程比线程更轻量,适合处理...
点赞
评论
收藏
分享
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-06 12:28
已编辑
郑州大学 Java
代码中的线程a会结束吗?
public class InterruptSynchronizedDemo { private static Object lock = new Object(); private static class A extends Thread { @Override public void run() { synchronized (lock) { while (!Thread.currentThread().isInterrupted()) {} } System.out.println("exit"); } } public static void test() thr...
Java面试专辑
点赞
评论
收藏
分享
2025-06-11 09:37
已编辑
长江大学 Java
并发编程(JUC)
基本概念 JUC JUC 就是指 java.util.concurrent 包,这个包提供了一系列的并发工具类及接口,可以简化多线程编程的过程,提高开发效率 进程 process,是正在执行的程序实例,是操作系统进行资源分配和调度的独立单位,每个进程都有自己独立的内存空间、系统资源以及一个唯一的进程标识符(PID)。 每个进程都有独立的内存空间(代码段、数据段、堆栈等)。 进程之间的通信需要通过进程间通信机制(IPC),如管道、共享内存、消息队列等。 进程的创建成本相对较高,因为需要分配独立的内存空间和系统资源。 线程 thread,是进程中执行的一个实体,是CPU调度和分派的基本单位。一...
计算机编程合集
点赞
评论
收藏
分享
03-06 18:14
郑州大学 Java
Timer有什么明显的缺点?
如果其中一个任务是无限循环,其他任务可能永远没有机会执行。如果其中一个任务run方法一旦抛出异常,Timer线程就会退出,从而所有定时任务都会被取消。
Java面试专辑
点赞
评论
收藏
分享
03-06 12:43
郑州大学 Java
并发容器的实现
Java中常用的几个并发容器容器实现使用场景CopyOnWriteArrayList内部是一个数组,这个数组是以原子方式被整体更新的。写:每次修改操作,都会新建一个数组,复制原数组的内容到新数组,在新数组上进行需要的修改,然后以原子方式设置内部的数组引用,这就是写时复制。多个线程不能同时写,每个写操作都需要先获取锁。CopyOnWriteArrayList内部使用ReentrantLock。读:先拿到当前引用的数组,然后直接访问该数组。在读的过程中,可能内部的数组引用已经被修改了,但不会影响读操作,它依旧访问原数组内容。读不需要锁,可以并行,读和写也可以并行。CopyOnWriteArrayL...
Java知识专辑
点赞
评论
收藏
分享
03-06 10:56
郑州大学 Java
synchronized的使用
每个Object对象都有一把锁和等待队列,一个线程在进入synchronized代码块时,会尝试获取锁,如果获取不到则会把当前线程加入等待队列中。执行synchronized的过程大致如下:尝试获得锁,如果能够获得锁,继续下一步,否则加入等待队列,阻塞并等待唤醒。执行实例方法体代码。释放锁,如果等待队列上有等待的线程,从中取一个并唤醒,如果有多个等待的线程,唤醒哪一个是不一定的,不保证公平性。当前线程不能获得锁的时候,它会加入等待队列等待,线程的状态会变为BLOCKED。synchronized保护的是对象而非代码,只要访问的是同一个对象的synchronized方法,即使是不同的代码,也会被...
Java知识专辑
点赞
评论
收藏
分享
03-05 16:54
郑州大学 Java
如何获取Java线程的状态
通过Java的Thread.State枚举和java.lang.management包中的工具(如ThreadMXBean),你可以获取和管理Java应用程序中线程的状态信息。例如,你可以使用ThreadMXBean的getThreadInfo(long id)方法来获取特定线程的详细状态信息。这对于调试和性能调优非常有帮助。
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-05 16:56
郑州大学 Java
Java线程有哪些成本?
操作系统会为每个线程创建必要的数据结构、栈、程序计数器等。创建线程也需要一定的时间。线程调度和切换也是有成本的,当有大量可运行线程的时候,操作系统会忙于调度,为一个线程分配一段时间,执行完后,再让另一个线程执行,一个线程被切换出去后,操作系统需要保存它的当前上下文状态到内存,上下文状态包括当前CPU寄存器的值、程序计数器的值等,而一个线程被切换回来后,操作系统需要恢复它原来的上下文状态,整个过程称为上下文切换,这个切换不仅耗时,而且使CPU中的很多缓存失效。
Java面试专辑
点赞
评论
收藏
分享
03-05 16:49
郑州大学 Java
Java线程的属性总结
属性说明id、nameid是一个递增的整数,每创建一个线程就加一。name的默认值是Thread-后跟一个编号,name可以在Thread的构造方法中进行指定,也可以通过setName方法进行设置。优先级getPriority()在Java中,优先级从1到10,默认为5。这个优先级会被映射到操作系统中线程的优先级,不过,因为操作系统各不相同,不一定都是10个优先级,Java中不同的优先级可能会被映射到操作系统中相同的优先级。另外,优先级对操作系统而言主要是一种建议和提示,而非强制。简单地说,在编程中,不要过于依赖优先级。状态getState()isAlive()返回线程是否活着,线程被启动后,...
Java知识专辑
点赞
评论
收藏
分享
03-05 16:47
郑州大学 Java
Java中线程是如何创建的?
两种方式:继承java.lang.Thread类实现java.lang. Runnable接口通过继承Thread来实现线程虽然比较简单,但Java中只支持单继承,每个类最多只能有一个父类,如果类已经有父类了,就不能再继承Thread。如果既要多线程能力,又要继承其他类,那么就需要使用Runnable。
Java面试专辑
点赞
评论
收藏
分享
玩命加载中
创作者周榜
更多
热议话题
更多
1
...
大厂实习和小厂实习最大的区别是什么?
0
2
...
参加完秋招的机械人,还参加春招吗?
0
1
...
开放七大实习专项,百度暑期实习值得冲吗
3
...
牛友の3月总结
0
4
...
拼多多工作体验
0
5
...
面试被问到不会的问题,你怎么应对?
0
1
...
厦门银行科技岗值不值得投
6
...
这些公司卡简历很严格
0
7
...
研究所VS国企,该如何选
0
8
...
通信硬件知识分享
0
9
...
实习最想跑路的瞬间
0
10
...
找AI工作可以去哪些公司?
0
牛客网
牛客网在线编程
牛客网题解
牛客企业服务