![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java多线程
mChenys
这个作者很懒,什么都没留下…
展开
-
CountDownLatch与thread.join()的区别
join在当前线程中,如果调用某个thread的join方法,那么当前线程就会被阻塞,直到thread线程执行完毕,当前线程才能继续执行。join的原理是,不断的检查thread是否存活,如果存活,那么让当前线程一直wait,直到thread线程终止,线程的this.notifyAll 就会被调用。我们来看一下这个应用场景:假设现在公司有三个员工A,B,C,他们要开会。但是A需要等B,C准备好...转载 2020-01-09 16:44:15 · 250 阅读 · 0 评论 -
线程的等待唤醒机制
( 1 )等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下:wait:告诉当前线程放弃执行权,并放弃监视器(锁)并进入阻塞状态,直到其他线程持有获得执行权,并持有了相同的监视器(锁)并调用notify为止。notify:唤醒持有同一个监视器(锁)中调用wait的第一个线程,例如,餐馆有空位置后,等候就餐最久的顾客最先入座。注意:被唤醒的线程是进入了可运行状态。等待cpu执...原创 2015-11-18 17:52:13 · 6167 阅读 · 0 评论 -
(六)volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一...转载 2019-08-22 16:08:46 · 210 阅读 · 0 评论 -
(五)Lock的使用
一.为什么会出现Lock也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?在上面一篇文章中,我们了解到如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;...转载 2019-08-21 18:37:47 · 668 阅读 · 0 评论 -
(四)synchronized的使用
什么时候会出现线程安全问题?在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题:由于每个线程执行的过程是不可控的,所以很可能导致最终的结果与实际上的愿望相违背或者直接导致程序出错。举个简单的例子:现在有两个线程分别从网络上...转载 2019-08-21 11:44:42 · 172 阅读 · 0 评论 -
(三)线程的状态和方法使用介绍
线程的状态在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于后面对Thread类中的方法的理解。线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。当需要新起一个线程来执行某个子任务...转载 2019-08-21 10:37:48 · 400 阅读 · 0 评论 -
(二) 线程和进程的创建
一.Java中关于应用程序和进程相关的概念在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认为java.exe或者javaw.exe(windows下可以通过任务管理器查看)。Java采用的是单线程编程模型,即在我们自己的程序中如果没有主动创建线程的话,只会创建一个线程,通常称为主线程。但是要注意,虽然只有一个线程来执行任务,不代表JVM中只有一个线程,J...转载 2019-08-20 18:10:22 · 377 阅读 · 0 评论 -
(一)Java并发编程:进程和线程之由来
一.操作系统中为什么会出现进程?说起进程的由来,我们需要从操作系统的发展历史谈起。也许在今天,我们无法想象在很多年以前计算机是什么样子。我们现在可以用计算机来做很多事情:办公、娱乐、上网,但是在计算机刚出现的时候,是为了解决数学计算的问题,因为很多大量的计算通过人力去完成是很耗时间和人力成本的。在最初的时候,计算机只能接受一些特定的指令,用户输入一个指令,计算机就做一个操作。当用户在思考或者输...转载 2019-08-20 15:58:50 · 123 阅读 · 0 评论 -
Semaphore(信号量)的使用
jdk1.5提供的api,位于java.util.concurrent.Semaphore 包下,常用方法有:void acquire() 从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。 void acquire(int permits) 从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,或者线程已被中断。原创 2016-05-15 23:13:50 · 1616 阅读 · 0 评论 -
Condition的使用
jdk1.5提供的api,位于java.util.concurrent.locks 包下,是一个接口, 常用方法有:void await() 造成当前线程在接到信号或被中断之前一直处于等待状态。 boolean await(long time, TimeUnit unit) 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。原创 2016-05-15 22:15:28 · 722 阅读 · 0 评论 -
ReadWriteLock的使用
jdk1.5提供的api,位于java.util.concurrent.locks 包下.ReadWriteLock是接口,其实现类是ReentrantReadWriteLock . ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。 与互斥锁相比,读-写锁允许对共享数据进原创 2016-05-15 20:36:46 · 612 阅读 · 0 评论