多线程并发
多线程以及并发基础知识以及常见问题专栏
南丘xf
好记性不如烂笔头——1枚昆明程序猿
展开
-
Java中如何理解可重入锁的概念?为什么ReentrantLock不手动释放锁会造成死锁?
之前有文章说过,synchronized和ReenTrantLock都是可重入锁,那么什么是可重入锁?可重入锁从字面意思就比较容易理解,自己获取了锁以后,可以再次获取该锁(重入)就叫可重入锁,同一个线程每次获取锁,锁计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。我们就以之前卖票的例子进行讲解,因为synchronized加锁和解锁的过程是自动进行,所以不会造成死锁,而ReentrantLock加锁和解锁的过程需要手动,所以如果加锁和释放锁次数不一,会导致死锁,我们看代码:publi原创 2020-06-02 10:50:49 · 2721 阅读 · 1 评论 -
如何理解Java中的公平锁和非公平锁?
从字面意思理解,其实灰常简单,公平就是大家买票都排队,不公平就是有人开了超级VIP,插队了。所以在多线程中,就存在公平锁和非公平锁,如何理解呢?公平锁:多个线程按照申请锁的顺序去获得锁,所有线程都在队列里排队,这样就保证了队列中的第一个先得到锁。优点:所有的线程都能得到资源,不会饿死在队列中。缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。非公平锁:多个线程不按照申请锁的顺序去获得锁,而是同时直接去尝试获取锁(插队),获取不到(插队失败),原创 2020-06-01 10:18:28 · 2864 阅读 · 0 评论 -
synchronized和ReenTrantLock有什么区别和联系?
synchronized是Java内建的同步机制,它提供了互斥的语义和可见性,当一个线程已经获取当前的锁时,其他试图获取的线程只能等待或者阻塞在那里。ReentrantLock和synchronized类似,都是可重入锁,但是ReentrantLock内部有提供了许多方法,使用起来相对灵活,比如需要通过.lock()实现加锁,通过.unlock()释放锁,不然会一直上锁。synchronized和ReenTrantLock都是可重入锁可重入锁:自己可以再次获取自己的内部锁就叫可重入锁。比如线程A获得了原创 2020-05-29 17:18:45 · 477 阅读 · 0 评论 -
双重检验锁方式实现单例模式的原理是什么?
单例模式大概是Java编程中最常用的设计模式之一了,之前也有文章说过什么是单例模式,链接如下:https://blog.csdn.net/weixin_39309402/article/details/98126883虽然这篇文章中也分析了如何利用同步锁机制保证懒汉式单例模式的线程安全问题,同步方法,同步代码块等,但都非最优的解决方法,今天我们就来讲讲什么是双重检验锁方式实现单例模式,包括它的特点和原理。/** * 双重检验锁方式实现单例模式 */public class DualLaz原创 2020-05-29 14:17:39 · 3010 阅读 · 1 评论 -
多线程中如何解决资源争抢的问题(synchronized关键字)?
说到解决多线程中资源争抢的问题,大多数第一个想到的关键字就是synchronized,它能够保证多个线程之间资源访问的同步性(即它修饰的方法或者代码块在任意时刻只能有一个线程执行)。/** * 一个座位一个人 两个电影窗口卖票 不加锁会造成什么结果? */public class Seat implements Runnable { private int seatNumber = 100; @Override public void run() { while (true) {原创 2020-05-27 09:42:40 · 2874 阅读 · 0 评论 -
sleep()和wait()、run()和start()、notify()和notifyAll()有什么区别?
sleep()和wait()有什么区别?1)sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类的方法;2)sleep()方法让调用线程进入睡眠状态,让出执行机会给其他线程,但是监控状态依然保持,时间到了自动恢复运行状态,wait()会让线程放弃对象锁,进入等待此对象的等待锁定池,只有notify()、notifyAll()方法才会进入运行状态;3)调...原创 2020-03-18 22:20:24 · 680 阅读 · 0 评论 -
Java终止线程有哪几种方式?那终止进程呢?
在讨论线程终止的方式前,我们先讨论一个问题,线程和进程有什么区别?简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程(一个进程可以包含多个线程)。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执...原创 2020-03-17 23:29:49 · 1235 阅读 · 0 评论 -
Java中有几种线程池?使用线程池有什么风险?
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具,它真正的线程池接口是ExecutorService。使用线程池能够为了防止资源不足,因为频繁创建和销毁线程会消耗大量资源,尤其是当线程执行时间>线程创建时间+线程销毁时间,此时会堆积大量线程。Java中,创建线程池有四种方式,如下:1)newCachedTh...原创 2020-03-11 13:49:36 · 1456 阅读 · 0 评论 -
Java创建线程的方式有哪些?相互之间有什么不同?
1)并行和并发有什么区别?解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。解释三:并行是在一台处理器上“同时”处理多个任务,并发是在多台处理器上同时处理多个任务,如hadoop分布式集群。所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。2)线程和进程的区...原创 2019-12-10 15:53:28 · 1258 阅读 · 0 评论