![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试题-多线程
文章平均质量分 70
面试题-多线程
啥也不懂的派大星
不能看的文章点个关注,私信我
展开
-
Synchronized锁和Lock锁的区别?和ReentrantLock的区别?
synchronized和lock的区别1,作用的位置不同synchronized可以给方法,代码块加锁lock只能给代码块加锁2,锁的获取锁和释放机制不同synchronized无需手动获取锁和释放锁,发生异常会自动解锁,不会出现死锁。lock需要自己加锁和释放锁,如lock()和unlock(),如果忘记使用unlock(),则会出现死锁。所以,一般我们会在finally里面使用unlock().3、synchronized是非公平锁,lock则默认是非公平锁,可设置为公平锁,如原创 2021-04-12 09:20:49 · 211 阅读 · 1 评论 -
为什么用线程池?解释下线程池参数?线程池处理流程?阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理?
为什么用线程池?解释下线程池参数?1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行。3、提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。corePoolSize 代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程maxinumPoolSize 代表的是最大线程数,它与核心线程数相对应,表示最大允许被创建的线程数,比如当前任务较多,将核心线程数都用原创 2021-05-04 13:36:10 · 696 阅读 · 1 评论 -
线程的生命周期和线程的状态
3,当线程调用sleep(time),或者wait(time)时,进入timed waiting状态,当休眠时间结束后,或者调用notify或notifyAll时会重新runnable状态。2,当线程调用wait()或者join时,线程都会进入到waiting状态,当调用notify或notifyAll时,或者join的线程执行结束后,会进入runnable状态。上述的就绪状态和运行状态,都表现为runnable状态。4,程序执行结束,线程进入terminated状态。原创 2021-04-09 23:03:06 · 427 阅读 · 0 评论 -
synchronized和volatile的区别
volatile:适用于只需要保证某个变量的可见性,而不需要同步控制的场景,如状态标志位等。synchronized修饰代码块,可以设置为锁对象,或者锁引用类型的变量、常量。synchronized修饰普通方法,锁的是方法的调用者,也就是对象。synchronized修饰静态方法,锁的是当前类的class对象。synchronized是修饰方法,代码块或整个类。synchronized,可以保证变量修改的。synchronized:加锁;的情况,例如对共享资源的读写操作。volatile是修饰变量。原创 2021-04-12 09:20:14 · 6034 阅读 · 1 评论 -
synchronized关键字底层原理
synchronized反编译后是由一对monitor-enter和monitor-exit指令实现的,反编译后可见!通过反编译后代码可以看出:对于同步方法,JVM采用ACC_SYNCHRONIZED标记符来实现同步。对于同步代码块。JVM采用monitorenter、monitorexit两个指令来实现同步。1,JDK1.6之前这对指令的实现是依靠操作系统内部的互斥锁来实现的,期间会涉及到用户态到内存态的切换,所以这个操作是一个重量级的操作,性能较低。2,JDK1.6之后原创 2021-04-12 09:20:58 · 144 阅读 · 0 评论 -
什么是悲观锁,什么是乐观锁?
什么是悲观锁,什么是乐观锁?1,悲观锁是利用数据库本身的锁机制来实现,会锁记录。实现的方式为:select * from t_table where id = 1 for update2,乐观锁是一种不锁记录的实现方式,采用CAS模式,采用version字段来作为判断依据。每次对数据的更新操作,都会对version+1,这样提交更新操作时,如果version的值已被更改,则更新失败。update A a set a.name = ‘zhang3’,version = v+1 where a.ti原创 2021-04-15 09:16:20 · 139 阅读 · 0 评论 -
谈谈你对AQS的理解。AQS如何实现可重 入锁?
aqs原创 2022-05-15 17:14:55 · 1383 阅读 · 0 评论 -
JUC笔记 比较杂乱
JUC并发编程线程,继承Thread类,实现Runnable、Callable接口Runnable无返回值,效率比Callable较低进程,如QQ.exe,一个进程包含多个线程,线程是CPU调度的基本单位Java默认两个线程,main线程和GC线程Java真的能开启线程吗?不能 start方法源码里面调用start0方法是个native本地方法 C++ 无法直接操作硬件并发VS并行并发:多线程同时操作一个资源并行:多线程执行 多核CPU 并发编程本质充分利用CPU资源线程的几个状态 源码原创 2021-04-17 23:06:38 · 181 阅读 · 1 评论 -
什么是死锁?如何防止死锁?
什么是死锁?如何防止死锁?什么是死锁?线程A持有独占锁资源a,并尝试去获取独占锁资源b,同时,线程B持有独占锁资源b,并尝试去获取独占锁资源a,这样线程A和线程B相互持有对方需要的锁,从而发生阻塞,最终变为死锁。如何防止死锁?减少同步代码块嵌套操作降低锁的使用粒度,不要几个功能共用一把锁尽量采用tryLock(timeout)的方法,可以设置超时时间,这样超时之后,就可以主动退出,防止死锁(关键)...原创 2021-04-14 10:43:08 · 209 阅读 · 0 评论 -
volatile关键字
那么这个时候就会发生,一个线程修改了数据,数据还没有及时刷到主内存,那么其他线程读取到的数据就依然还是旧的,这就是可见性问题发生的根源。第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);当变量被声明为volatile后,线程每次都会都从主内存去读取,而不是读取自己的工作内存,这样就实现了线程之间的可见性。所谓的可见性是指当一个线程修改了变量的值之后,其他线程可以感知到该变化。原创 2021-04-12 09:20:34 · 210 阅读 · 0 评论 -
Sleep()和wait()的区别,join()、yield()的区别、sleep(0)的作用
来解释下,我们回想下,在同步代码块中,我们说需要一个对象锁来实现多线程的互斥效果,也就是说,原创 2021-04-10 21:00:44 · 223 阅读 · 1 评论 -
对线程安全的理解?
场景二:如果每个线程访问的是各自的资源,那么就不需要考虑线程安全的问题,所以这个时候,我们可以放心使用非线程安全的对象,比如StringBuilder比如在方法中,创建对象,来实现字符串的拼接。一个专业的描述是,当多个线程访问一个对象时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的。当多个线程访问一个对象时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的。原创 2021-04-10 21:16:39 · 203 阅读 · 1 评论 -
ThreadLocal关键字的理解和使用?ThreadLocal内存泄露原因,如何避免?InheritableThreadLocal获取父线程的值?
ThreadLocal解决了什么问题?内部源码是怎么样的?解决线程安全问题。为每个线程创建一个变量副本,实现在线程的上下文传递同一个对象,比如connection。ThreadLocal使用get()、set()方法实现1、证明ThreadLocal为每个线程创建一个变量副本public class ThreadLocalTest { private static ThreadLocal<Long> threadLocal = new ThreadLocal<>()原创 2021-04-10 21:35:18 · 312 阅读 · 2 评论 -
JDK提供的线程池有哪些?创建与使用?拒绝策略?堵塞队列?线程池的大小?
JDK提供的线程池有哪些?实际开发我们该怎么使用?1,JDK通过接口ExecutorService来表示线程池,通过工具类Executors来创建多种线程池对象2,各种线程池的特点如下:newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newCachedThreadPoo原创 2021-04-10 21:10:22 · 638 阅读 · 1 评论 -
创建线程的方式 启动线程的方式
常说的3种:继承Thread实现Runable接口实现Callable接口(可以获取线程执行之后的返回值)但实际后两种,更准确的理解是创建了一个可执行的任务,要采用多线程的方式执行,还需要通过创建Thread对象来执行,比如 new Thread(new Runnable(){}).start();这样的方式来执行。在实际开发中,我们通常采用线程池的方式来完成Thread的创建,更好管理线程资源本质上来说创建线程的方式就是继承Thread,就是线程池,内部也是创建好线程对象来执行任务。...原创 2021-04-09 22:35:24 · 118 阅读 · 0 评论 -
一个普通main方法的执行,是单线程模式还是多线程模式?为什么?对守护线程的理解?
举例, GC垃圾回收线程:就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。反之,如果一个正在执行某个操作的线程必须要正确地关闭掉否则就会出现不好的后果的话,那么这个线程就不能是守护线程,而是用户线程。因为java有个重要的特性,叫垃圾自动回收机制,即GC线程,所以答案是多线程,这里面有两部分,主线程(用户线程),垃圾回收线程GC(守护线程)同时存在,GC线程是守护线程。原创 2021-04-09 22:40:22 · 276 阅读 · 0 评论 -
并发、并行、串行的区别?并发的三大特性?
并发是指同一个CPU执行多个任务,按细分的时间片交替执行,通常表现为多线程同时执行。并发允许两个任务彼此干扰。统一时间点、只有一个任务运行,交替执行。并行在时间上是重叠的,两个任务在同一时刻互不干扰的同时执行。并行在多个CPU上同时处理多个任务。串行在时间上不可能发生重叠,前一个任务没搞定,下一个任务就只能等着。原创 2021-04-11 18:54:09 · 433 阅读 · 0 评论