
多线程
不羁朔风
但行好事,不问前程
展开
-
线程调度的方式(简单易懂)
1.分时调度所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。2.抢占式调度优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。...原创 2018-11-09 08:06:30 · 6380 阅读 · 0 评论 -
进程和线程的区别
①进程指正在运行的程序,是操作系统进行资源分配和调度的基本单位;线程是CPU调度的基本单位.②一个程序运行后至少有一个进程,一个进程中可以包含多个线程③进程具有自己独立的内存空间,各个线程之间共享进程的内存空间(堆和方法区)和一些进程级的资源(比如打开的文件),但是各个线程拥有自己的栈空间....原创 2018-11-08 21:54:17 · 215 阅读 · 0 评论 -
线程间的通信
在Java中主要通过等待唤醒机制来实现线程间的通信等待唤醒机制所涉及到的方法:wait() :等待,将正在执行的线程释放其执行资格 和 执行权,并存储到线程池中。 notify():唤醒,唤醒线程池中被wait()的线程,一次唤醒一个,而且是任意的。 notifyAll(): 唤醒全部:可以将线程池中的所有wait() 线程都唤醒。其实,所谓唤醒的意思就是让 线程池中的线程具备执行资...原创 2018-11-08 21:53:23 · 181 阅读 · 0 评论 -
进程间的通信机制
进程间的通信机制套接字:套接字socket,由目标计算机的IP地址和进程的端口号组成共享内存:由一个进程创建,但是多个进程可以访问消息队列:存放在内核中的消息链表信号:向接收进程通知某个事件已经发生信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源管道:半双工的通信方式,数据只能单向流动,...原创 2018-11-08 21:52:21 · 690 阅读 · 0 评论 -
进程的调度
为什么要进行进程的调度充分,高效,及时,公平利用CPU的资源可以在内存中存放数目远大于CPU数的进程进程调度的方式①非抢占式调度:一旦占用CPU,直到进程执行完成或者阻塞为止先来先服务算法优先级优先调度算法 ②抢占式调度:在一定情况下,可以剥夺另外一个进程占用的CPU时间片轮转调度算法优先级优先调度算法进程的调度算法①先来先服务算法(FC...原创 2018-11-08 21:51:35 · 557 阅读 · 1 评论 -
进程的状态
就绪态:进程已经准备好,只要分配到CPU就可以执行执行态:进程处于就绪态被调度后,进出进入执行状态阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓冲区失败)而暂时无法运行,进程进入阻塞态,当满足请求时进程进入就绪态...原创 2018-11-08 21:50:27 · 252 阅读 · 0 评论 -
并发(Concurrent)和并行(Parallel)和区别
并发单个处理器(CPU),轮换执行多个任务,因为轮换的速度比较快,看起来好像多个任务在同时执行一样并行多个处理器(CPU),同时执行多个任务,每个任务分配在一个处理器上执行并发就像是一个大人给两个婴儿喂饭,喂完这个喂那个;并行,就是两个大人分别同时给两个婴儿喂饭...原创 2018-11-08 21:49:48 · 1623 阅读 · 0 评论 -
线程数设多少合适
①工作线程数是不是设置的越大越好? 回答:肯定不是的 1)一来服务器CPU核数有限,同时并发的线程数是有限的,1核CPU设置10000个工作线程没有意义 2)线程切换是有开销的,如果线程切换过于频繁,反而会使性能降低②如果CPU是单核,设置多线程有意义么,能提高并发性能么? 回答:即使是单核,使用多线程也是有意义的 ...原创 2018-11-10 19:35:09 · 7352 阅读 · 0 评论 -
谈谈你对CountDownLatch的理解
CountDownLatch是java.util.concurrent包中一个工具类。它能够使一个或者多个线程等待另外一些线程完成各自的工作之后,再继续执行使用CountDownLatch的一些情景:①需要去解析一个Excel的数据,为了更快的解析,每个sheet都使用一个线程进行解析,但是最后汇总数据的工作需要等待每个sheet的解析工作完成之后才能进行②开启多个线程分块传输一个大数...原创 2018-11-10 19:34:42 · 1037 阅读 · 0 评论 -
LongAdder和AtomicLong的区别
AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用自循(CLH)方式不断地cas到特定的值,从而达到更新数据的目的。然而在线程竞争激烈的情况下,自循往往浪费很多计算资源才能达成预期效果。 面对自循的缺点,jdk1.8推出了LongAdder类,他的实现方式有点像ConcurrentHashMap一样,采用空间换时间的方式,提高在线程竞争激烈的...原创 2018-11-10 19:34:15 · 1438 阅读 · 0 评论 -
谈谈你对AtomicInteger的理解
AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。十分适合高并发情况下的使用 对于全局变量的数值类型操作 num++,若没有加synchronized关键字则是线程不安全的,num++解析为num=num+1,明显,这个操作不具备原子性,多线程时必然会出现问题。测试下:输出的结果为count: 9992,这个值不定,每次测试都可能不一样,很...原创 2018-11-09 08:15:17 · 6034 阅读 · 2 评论 -
如何线程安全地实现一个计数器
i++是线程安全的吗 i++和++i的线程安全分为两种情况:1、如果i是局部变量(在方法里定义的),那么是线程安全的。因为局部变量是线程私有的,别的线程访问不到,其实也可以说没有线程安不安全之说,因为别的线程对他造不成影响。2、如果i是全局变量(类的成员变量),那么是线程不安全的。因为如果是全局变量的话,同一进程中的不同线程都有可能访问到。如何线程安全地实现一个计数器或者这...原创 2018-11-09 08:13:50 · 4155 阅读 · 0 评论 -
ReentrantLock可重入锁
ReentraantLock是通过一个FIFO的等待队列来管理获取该锁所有线程的。在“公平锁”的机制下,线程依次排队获取锁(先等待的线程先获得锁);而“非公平锁”在锁是可获取状态时,不管自己是不是在队列的开头都会获取锁。 ReentrantLock和synchronized的相同点①ReentrantLock和synchronized一样都具有可重入性ReentrantLock和s...原创 2018-11-09 08:12:10 · 893 阅读 · 0 评论 -
synchronized和Lock有什么区别
java语言中提供了两种锁机制来实现对某个共享资源的同步:synchronized和Lock.其中synchronized使用Object对象本身的notify,wait和notifyAll来实现线程之间的调度.而Lock可以使用Condition进程线程之间的调度①用法不同synchronized可以加在方法上,也可以加在特定的代码块中,括号中表示需要锁的对象Lock需要显式地指定起...原创 2018-11-09 08:11:06 · 1516 阅读 · 0 评论 -
终止线程的方法
在java语言中,可以使用stop()方法和suspend()方法来终止线程的执行.当使用Thread.stop()来终止线程时,它会释放已经锁定的所有监视资源,具有不安全性suspend()方法不会释放锁,容易发生死锁(两个或者两个以上进程在执行过程中,因争夺资源而造成进程间互相等待的现象,如果无外力干涉,它们将无法推进)问题鉴于以上两种方法的不安全性,java语言已经不建议使用以上...原创 2018-11-09 08:10:27 · 433 阅读 · 0 评论 -
sleep和yield方法的区别
①sleep方法给其他线程运行机会时不考虑线程的优先级,因此会给低线程优先级运行的机会,而yield方法只会给相同优先级或者更高优先级线程运行的机会②线程执行sleep()方法后转入阻塞状态,所以,执行sleep()方法的线程在指定的时间内不会被执行,而yield()方法只是使当前线程重新回到可执行状态,所以执行yield()方法的线程可能在进入可执行状态后马上又被执行③sleep()方法...原创 2018-11-09 08:09:44 · 7285 阅读 · 0 评论 -
sleep和wait方法的区别
①原理不同sleep()方法是Thread类的静态方法,它会使线程的执行暂停一段时间,把执行机会让给其他线程,等倒计时时间一到,此线程会自动苏醒wait()是Object类的方法,用于线程间的通信,使当前拥有锁的进程等待,直到其他线程调用notify()方法才醒过来②对锁的处理机制不同调用sleep()方法不释放锁(因为它不释放锁,所以容易导致死锁问题的发生,所以一般情况下,不推荐...原创 2018-11-09 08:09:08 · 502 阅读 · 0 评论 -
同步异步的区别
多个线程对同一个资源进行写操作,当线程A需要使用某个资源时,如果这个资源正在被B使用,同步机制会让A一直等待下去,直到线程B结束对该资源的使用后,线程A才能使用这个资源.由此可见,同步机制能够保证线程的安全如何实现同步操作呢?必须获得每一个线程对象的锁.获得它可以保证在同一时刻只有一个线程能够进入临界区(访问相同资源的代码块),并且在这个锁释放之前,其他线程不能进入这个临界区.如果还有线程...原创 2018-11-09 08:07:15 · 891 阅读 · 0 评论 -
线程的生命周期(线程的状态)
有执行资格:线程已经准备好有执行权:抢到了CPU的执行权在java语言中,线程有四种状态:运行,就绪,阻塞(或者说挂起)和结束(或者说死亡)转载 2018-11-09 08:05:20 · 208 阅读 · 0 评论