![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线程
carson0408
热衷于编程,喜欢研究算法,挑战难题,享受AC的过程,希望自己能够不断进步,不断成长。
展开
-
CountDownLatch的工作原理以及实例
CountDownLatch、CyclicBarrier是多线程重要的类,本文主要进行对其主要原理的讲解,并且通过举例的形式,使得原理更加清晰,更易了解。1.CountDownLatch工作原理 CountDownLatch在多线程并发编程中充当一个计时器的功能,并且维护一个count的变量,并且其操作都是原子操作,该类主要通过countDown()和await()两...原创 2018-03-07 14:49:34 · 3069 阅读 · 0 评论 -
读者-写者问题
读者写者问题是指对于多个读者和多个写者来说,多个读者可以同时阅读数据,读者读取数据时,需要排斥写者;但是只能一次只能由一个读者进行写入,读者写入时,其它写者与读者都阻塞。其中写锁就相当于我们平时经常使用的互斥锁,而读锁就相当于共享锁。因此,针对读者-写者问题,如果我们只是单纯的使用互斥锁来实现,的确能做到按序执行,并且不会出现脏读;但是却无法实现多个读者共享数据。因此,本文使用读写...原创 2018-03-22 14:41:48 · 392 阅读 · 0 评论 -
生产者消费者问题
生产者消费者问题是多线程问题中关于线程间通信的比较经典的问题。该问题需要注意的是存在一个缓冲区,当缓冲区满时,生产者不可以加入数据,消费者可以获取数据进行消费;相反,当缓存区为空时,消费者无法消费,但是生产者可以消费。解决生产者消费者问题的方法就是在两者建立线程通信。1.await()、notify、notifyAll()方法 通过建立一个最大缓存区的最大容量,并且将...原创 2018-03-20 21:23:50 · 202 阅读 · 0 评论 -
死锁
针对多线程问题,解决方法之一就是同步,但是同步可能会导致另一个问题:死锁。如果两个线程需要独自访问同样的一个资源集,而每个线程分别有这些资源的不同子集,如果两个线程都不愿意放弃已经拥有的资源,就会进入无限停止状态。这时候两个线程仍然是活线程,均未挂起,但是陷入了一种相互不肯退让的状态,这就是死锁现象。1.产生死锁的原因1.资源不足,竞争资源引起死锁:当系统中有有多个线程共享的资源,...原创 2018-03-31 09:17:25 · 143 阅读 · 0 评论 -
哲学家就餐问题
哲学家就餐问题是指5个哲学家坐成一圈,每两个之间有一把叉子,只有当同时握有两把叉子才能用餐,哲学家除了吃饭还有思考时间,假如5个哲学家同时拿起左手的叉子,这时候又准备拿右手的叉子,那么将陷入死锁状态;假如规定如果左手叉子拿到之后一段时间没拿到右手叉子,那么将放下左手叉子,然后再继续尝试,那么这样就有可能陷入死循环的状态。本文主要通过给定叉子的状态,每次取叉子需要判断左右两边的叉子是...原创 2018-03-21 10:59:51 · 318 阅读 · 0 评论 -
熟睡的理发师问题
熟睡的理发师问题中,一个理发师对应n个顾客的问题,该理发店只能容纳n个顾客,当没有顾客的时候,理发师就会睡觉;当顾客来了,理发师就会醒过来。对于顾客而言,当来到理发店,若理发师睡着了,则叫醒理发师,如果店里人满了,则离开,如果人没满,但理发师在忙,则进行等待。在这个过程中,有几点需要注意的,首先是假定人是按一定顺序进来的,而不是一蜂窝进来,那么需要保证人进来的过程是同步的,本文示例...原创 2018-03-21 15:51:56 · 1238 阅读 · 0 评论 -
Executor源码解析
任务执行有两种方案,一种是串行执行任务,第二种就是为每个任务创建一个线程;串行执行的问题在于其糟糕的响应性和吞吐量,而后者的问题在于资源管理的复杂性,为每个任务分配一个线程会出现耗内存甚至系统崩溃的问题。因此引入了线程池的概念为合理缓解两者存在的问题。而线程池通过实现Executor框架中的接口来进行工作,首先来看下图的Executor框架的接口以及类的结构图: 如上...原创 2018-05-10 19:04:56 · 781 阅读 · 0 评论 -
ReentrantReadWriteLock源码解析
为保证线程安全,经常用到的有内置锁synchronized和ReentrantLock。这两种是明显的互斥锁,每次最多只能有一个线程拥有锁。使用互斥锁可以有效避免“写读冲突”、“写写冲突”、“读读冲突”,从而保证线程安全。但是,很明显,“读读冲突”是不需要避免的,因为多个线程读并不会·出现线程安全问题。如果在读操作比较多的情景下,使用互斥锁,则会显得过于保守强硬,从而抑制了性能。因...原创 2018-05-19 22:02:24 · 193 阅读 · 0 评论 -
单例模式(从双重加锁走向延迟初始化占位类模式)
说起单例模式,大家应该都可以熟悉单例模式的三种不同情况吧:饿汉模式、懒汉模式以及DCL模式。以下首先分别对三种模式呈上相应的代码。1.几种单例模式的形式饿汉式:public class Singleton1 { private static final Singleton1 singleton1=new Singleton1();//饿汉形式,初始化时就进行初始化对象,并且声明不...原创 2018-05-21 22:28:15 · 2212 阅读 · 7 评论 -
线程安全版的ArrayList的性能比较--Collections.synchronizedList与CopyOnWriteArrayList
ArrayList是线程不安全的,因此在并发编程时,经常会使用Collections.synchronizedList与CopyOnWriteArrayList来替代ArrayList,接下来对这两种list进行性能的比较。其中Collections.synchronizedLis在更新操作中使用了同步锁,而CopyOnWriteArrayList在更新操作中不仅使用了可重入锁...原创 2018-08-19 11:25:33 · 12859 阅读 · 0 评论 -
Java多线程之线程池
Java多线程中如果每个请求到达就创建一个新线程,由于线程的创建与销毁都需要很大的开销,甚至比处理这些请求的时间和资源要多的多。因此,如果在一个JVM里要实现很多请求,每个请求对应一个线程的话,那么会增加系统的消耗和负担。为了避免这些缺点,服务器应用程序需要限制给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行...原创 2018-03-05 17:07:32 · 215 阅读 · 0 评论 -
乐观锁与悲观锁
乐观锁和悲观锁是多线程并发编程中的两种思想。其中乐观锁是指假定不会发生并发冲突,只在提交操作时检查是否违反数据完整性。就是说使用了乐观锁,只会在提交的时候判断是否出现冲突,如果出现了冲突由开发者进行判断如何继续操作。而悲观锁则是假定会发生并发冲突,是一种保守的思想,屏蔽一切可能违反数据完整性的操作。以下通过乐观锁和悲观锁的具体实现方式来更深入了解这两种思想。1.悲观锁 ...原创 2018-03-12 10:52:21 · 320 阅读 · 0 评论 -
CyclicBarrier的工作原理及其实例
CyclicBarrier是多线程中一个重要的类,主要用于线程组内部之间的线程的相互等待问题。 1.CyclicBarrier的工作原理 CyclicBarrier大致是可循环利用的屏障,顾名思义,这个名字也将这个类的特点给明确地表示出来了。首先,便是可重复利用,说明该类创建的对象可以复用;其次,屏障则体现了该类的原理:每个线程执行时,都会碰到一个屏障,直...原创 2018-03-07 16:43:00 · 8154 阅读 · 4 评论 -
Semaphore的工作原理及实例
Semaphore是一种在多线程环境下使用的设施,该设施负责协调各个线程,以保证它们能够正确、合理的使用公共资源的设施,也是操作系统中用于控制进程同步互斥的量。Semaphore是一种计数信号量,用于管理一组资源,内部是基于AQS的共享模式。它相当于给线程规定一个量从而控制允许活动的线程数。1.工作原理 以一个停车场是运作为例。为了简单起见,假设停车场只有三个车位,一...原创 2018-03-07 20:15:36 · 29555 阅读 · 22 评论 -
Exchanger的工作原理及实例
1.实现原理 Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线...原创 2018-03-07 21:51:27 · 10108 阅读 · 3 评论 -
Java多线程之原子性操作
何谓原子性操作,即为最小的操作单元,比如i=1,就是一个原子性操作,这个过程只涉及一个赋值操作。又如i++就不是一个原子操作,它相当于语句i=i+1;这里包括读取i,i+1,结果写入内存三个操作单元。因此如果操作不符合原子性操作,那么整个语句的执行就会出现混乱,导致出现错误的结果,从而导致线程安全问题。因此,在多线程中需要保证线程安全问题,就应该保证操作的原子性,那么如何保证操作的...原创 2018-03-09 21:59:48 · 4658 阅读 · 5 评论 -
多线程的创建方法
所谓线程就是就是一个执行单元,而一个进程就是一个程序,简单来说,打开一个qq软件就是一个进程,同时打开一个微信,那就是两个进程。那么线程就是在一个轻量级进程,比如打开微信与A聊天是一个线程,与B聊天就是另一个线程。使用多线程的好处:1.可以减少程序的响应时间。2.与进程相比,线程的创建和切换开销更小。3.使用多线程能够简化程序的结构,便于程序理解和维护。 以下就是来说...原创 2018-03-02 20:46:18 · 192 阅读 · 0 评论 -
常见的线程方法一
多线程中有许多常见的方法能够使多线程的使用过程中实现更多的动能,比如Thread类提供的sleep()、yield()、join()等方法。1.sleep() sleep()是使线程暂停执行一段时间的方法,是Thread类的静态方法,是线程用来控制自身流程的,暂停过程中会把执行机会让给其它线程,等到计时时间一到,此线程会自动"苏醒"。sleep()方法必须捕获异常,在...原创 2018-03-02 22:14:52 · 201 阅读 · 0 评论 -
Java多线程同步问题
何谓同步问题呢?就是比如银行开了一个账户,那么如果我在ATM机上执行两个操作,分别是存入了200元,然后取出100元,原来账户中假设有1000元,那么此时操作完上述两步骤之后账户中总共有1100元。在银行账户上操作只有等当前步骤操作完才能进行下一个步骤,这就是同步。如果不同步呢,那么可能存入钱的时候同时取了钱,可能取完钱账户数据更新为900元,那么这就是因为不同步产生的脏数据。接下...原创 2018-03-03 12:03:45 · 254 阅读 · 0 评论 -
Java多线程之线程交互
线程交互是指两个线程之间通过通信联系对锁的获取与释放,从而达到较好的线程运行结果,避免引起混乱的结果。一般来说synchronized块的锁会让代码进入同步状态,即一个线程运行的同时让其它线程进行等待,那么如果需要进行实现更复杂的交互,则需要学习以下几个方法:void notify():唤醒在此对象监视器上等待的单个线程。void notifyAll():唤醒在此对象监视器上等待的...原创 2018-03-04 18:48:16 · 8123 阅读 · 0 评论 -
Java多线程之Lock锁的线程交互
之前创建锁的方式中,有说过Lock机制,并且比较了synchronized和lock的区别。本文主要讲解一下lock锁的功能以及实现线程交互。1.lock()方法与tryLock()方法 lock()方法指占用一个锁,当前线程占用这个对象,则其它线程则只能进入等待状态,而tryLock()方法,则是试图在指定时间内占用当前同步对象,如果占用不了继续等待,其它线程试图抢...原创 2018-03-04 21:45:00 · 446 阅读 · 0 评论 -
并发编程之SynchronizedMap和ConcurrentHashMap性能比较
HashMap是线程不安全的,只适用于单线程。因此在并发编程常用其对应的线程安全的类,常用的有Collections工具类的synchronizedMap创建的Map对象,是属于线程安全的;其次就是并发包下的ConcurrentHashMap类。两者由于实现原理稍有不同,因此在读与写的性能上也会有所差异。接下来通过编写测试程序对两者的读写性能分别做比较。测试类如下:import ...原创 2018-08-19 21:52:54 · 9501 阅读 · 2 评论