多线程
qfc8930858
念念不忘,必有回响!
展开
-
创建线程的两种方式区别
Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法。 ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。下面就从几个例...转载 2019-02-24 12:54:54 · 1770 阅读 · 0 评论 -
同步与阻塞,异步与非阻塞 (另一种切入点)
同步与阻塞,异步与非阻塞同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。处理大并发之一 对异步非阻塞的理解 在研究nginx和node.js的时候常会遇到异步、非阻塞等,之前自己也经常使用epol...原创 2019-04-24 13:52:01 · 110 阅读 · 0 评论 -
队列同步器(一)独占式
一概述队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。二 基本实现原理AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成获取...原创 2019-05-04 16:26:53 · 252 阅读 · 0 评论 -
队列同步器(二 )共享式
一概述共享式获取与独占式获取最主要的区别在于同一时刻能否有多个线程同时获取到同步状态。以文件的读写为例,如果一个程序在对文件进行读操作,那么这一时刻对于该文件的写操作均被阻塞,而读操作能够同时进行。写操作要求对资源的独占式访问,而读操作可以是共享式访问,两种不同的访问模式在同一时刻对文件或资源的访问情况,如图5-6所示。在图5-6中,左半部分,共享式访问资源时,其他共享式的访问均被允...原创 2019-05-04 17:08:50 · 144 阅读 · 0 评论 -
重入锁(ReentrantLock)
一 概述实现重进入重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞,该特性的实现需要解决以下两个问题。线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。 锁的最终释放。线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自...原创 2019-05-04 22:30:54 · 246 阅读 · 0 评论 -
synchronized关键字最主要的三种使用方式的总结
修饰实例方法,作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份,所以对该类的所有对象都加了锁)。所以如果一个线程A调用一个实例对象的非静态 s...原创 2019-04-20 11:03:18 · 1248 阅读 · 0 评论 -
深入理解CAS算法原理
概述CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。例如:这个时候我们可以使用Java并发包原子操作类(Atomic开头)通过方法调用,我们...原创 2019-04-20 16:09:31 · 2344 阅读 · 1 评论 -
java线程面试题
1.Java多线程中的死锁死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷...原创 2019-05-11 20:16:27 · 130 阅读 · 0 评论 -
Java中如何正确的终止线程
1、Java中API自带的stop()方法,来终止线程 Thread提供了一个stop()方法,但是stop()方法是一个被废弃的方法。为什么stop()方法被废弃而不被使用呢?原因是stop()方法太过于暴力,会强行把执行一半的线程终止。这样会就不会保证线程的资源正确释放,通常是没有给与线程完成资源释放工作的机会,因此会导致程序工作在不确定的状态下。2、使用标志位 :使用bo...原创 2019-08-04 21:05:37 · 161 阅读 · 0 评论 -
手写一个生产者和消费者的例子
一、用synchronized对存储加锁,然后用object原生的wait() 和 notify()做同步。import java.util.LinkedList;import java.util.Queue;public class ProducerAndConsumer { private final int MAX_LEN = 10; private Queue&...原创 2019-08-07 22:42:23 · 203 阅读 · 0 评论 -
Java n个线程轮流打印数字的问题
一、两个线程轮流打印数字。加锁实现:package lianxi;/* * 用锁实现两个线程轮流打印1——100 */public class Print1TO100TwoThread { private Object lock = new Object(); private int i = 0; Thread threadA = new Thread(new Runn...原创 2019-08-06 14:36:15 · 567 阅读 · 0 评论 -
Java n个线程轮流打印数字的问题(二)
一、两个线程实现轮流打印1-100。package lianxi;public class PrintNumSyn implements Runnable { private static Object lock = new Object(); private int num; PrintNumSyn(int num) { this.num = num; } @Overrid...原创 2019-08-06 18:14:08 · 454 阅读 · 0 评论 -
进程间通信的方式
进程间通信的方式大概有以下几种:共享内存:顾名思义,共享内存就是两个进程同时共享一块内存,然后在这块内存上的数据可以共同修改和读取,达到通信的目的;共享内存是最快的ipc方式;共享内存常与信号量进行配合使用,信号量是一个控制资源访问的标识符,简单来说就是一个计数器,通过信号量能实现锁以及著名的pv操作等,主要是用来实现进程间同步。无名管道:无名管道是半双工的通信方式;并且只能在具有亲缘关系...转载 2019-08-30 20:17:03 · 151 阅读 · 0 评论 -
操作系统中的进程调度策略有哪几种
先来先服务调度算法 短作业(进程)优先调度算法 高优先权优先调度算法 高响应比优先调度算法 时间片轮转法 多级反馈队列调度算法原创 2019-08-30 20:19:31 · 430 阅读 · 0 评论 -
如何创建线程池 ————面试中的问题
3.1 为什么要用线程池?线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源...原创 2019-05-03 21:21:07 · 6316 阅读 · 0 评论 -
谈谈 synchronized和ReentrantLock 的区别
① 两者都是可重入锁两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。② synchronized 依赖于 JVM 而 ReentrantLock ...原创 2019-05-03 20:41:56 · 576 阅读 · 0 评论 -
并发编程之原子性、可见性、有序性的简单理解
并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行。可见性:当多个线程同时访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。有序性:程序执行的顺序按照代码的先后顺序执行。对于单线程,在执行代码时jvm会进行指令重排序,处理器...原创 2019-02-24 15:41:19 · 109 阅读 · 0 评论 -
概括的解释下线程的几种可用状态。
1. 新建( new ):新创建了一个线程对象。2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码...原创 2019-03-05 22:32:59 · 211 阅读 · 0 评论 -
java多线程—Thread、Runnable和Callable区别
多线程编程优点 进程之间不能共享内存,但线程之间共享内存非常容易。 系统创建线程所分配的资源相对创建进程而言,代价非常小。 Java中实现多线程有3种方法: 继承Thread类 实现Runnable接口 实现Callable接口(参考<Java编程思想(第4版)> 21.2.4章节,原来一直以为是2种,后来发现是3种) 回到顶部第...转载 2019-03-14 20:12:17 · 229 阅读 · 0 评论 -
Java中的Lock与synchronized
一、什么是可重入锁Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别。ReentrantLock是Lock的一个实现类,字面意思的话就是可重入锁,那么什么是可重入锁呢。可重入锁是锁的一个相关概念,并不是特指我们的ReentrantLock,而是如果一个锁具备可重入性,那我们就说这是一个可重入锁。ReentrantLock和...转载 2019-03-18 20:30:51 · 167 阅读 · 0 评论 -
并发和并行区别
并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。并发性:多道程序环境中CPU处理排队中的程序(一个程序一个程序的处理)(实质并非同一时刻进行)并行性:同一时刻发生的事件打个比方。并发,就像一个人(cpu)喂2个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。并行,就是2个人喂2个孩子,两个孩子也同时在吃饭原文出处:htt...转载 2019-03-24 09:00:01 · 157 阅读 · 0 评论 -
关于线程池的面试题目
1、背景相信大家在面试过程中遇到面试官问线程的很多,线程过后就是线程池了。从易到难,都是这么个过程,还有就是确实很多人在工作中接触线程池比较少,最多的也就是创建一个然后往里面提交线程,对于一些经验很丰富的面试官来说,一下就可以问出很多线程池相关的问题,与其被问的晕头转向,还不如好好学习。此时不努力更待何时。2、什么是线程池?线程池是一种多线程处理形式,处理过...转载 2019-04-08 11:19:46 · 3319 阅读 · 4 评论 -
volatile关键字详解
volatile的特性Java内存模型对volatile专门定义了一些特殊的访问规则,当一个变量定义为volatile之后,它将具备两种特性。保证此变量对所有线程的可见性,即当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成,例如,线程A修改一个普通变量的值,然后向主内存进行回写,另外一条线程B在线...原创 2019-04-20 20:58:33 · 122 阅读 · 0 评论 -
wait()和sleep()的区别
sleep()是使线程暂停执行一段时间的方法。wait()也是一种使线程暂停执行的方法。例如,当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。并且可以调用notify()方法或者notifyAll()方法通知正在等待的其他线程。notify()方法仅唤醒一个线程(等待队列中的第一个线程)并允许他去获得锁。notifyAll()方法唤醒所有等待这个对象的线程并允许他们去...转载 2019-04-22 16:59:59 · 8892 阅读 · 4 评论 -
多线程的优势
1,线程在程序中是独立的,并发的执行流,但是,与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存,文件句柄和其他每个进程应有的状态。2,线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性:多个线程将共享同一个进程虚拟空间。线程共享的环境包括:进程代码段,进程的公有数据等。利用这些共享的数据等,线程很容易实现相互之间的通信。3,当操作系统创建一个进程时,必须为进程分...原创 2019-04-23 17:08:57 · 435 阅读 · 0 评论 -
面试中乐观锁和悲观锁的问题
目录一、基本概念二、实现方式(含实例)三、优缺点和适用场景四、面试官追问:乐观锁加锁吗?五、面试官追问:CAS有哪些缺点?一、基本概念乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。...原创 2019-05-02 22:31:41 · 278 阅读 · 0 评论 -
Sleep(0)的妙用----加深对操作系统的理解
Thread.Sleep(0) 表示挂起0毫秒,你可能觉得没作用,你要写Thread.Sleep(1000) 就有感觉了。似乎毫无意义。MSDN的说明:指定零 (0) 以指示应挂起此线程以使其他等待线程能够执行。Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确实的被冻结了一下,让其他线程有机会优先执行。Thread.S...转载 2019-05-03 15:30:54 · 311 阅读 · 0 评论 -
线程间的通信
一概述线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行,直到终止。但是,每个运行中的线程,如果仅仅是孤立地运行,那么没有一点儿价值,或者说价值很少,如果多个线程能够相互配合完成工作,这将会带来巨大的价值。任意一个对象都拥有自己的监视器,当这个对象由同步块或者这个对象的同步方法调用时,执行方法的线程必须先获取到该对象的监视器才能进入同步块或者同步方法,而没有获取...原创 2019-05-03 17:13:02 · 133 阅读 · 0 评论 -
Java线程中yield()的用法
Thread.yield()方法作用是:暂停当前正在执行的线程对象(及放弃当前拥有的cup资源),并执行其他线程。yield()做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。注意:yield...原创 2019-05-03 18:52:43 · 357 阅读 · 0 评论 -
实现一个简单的阻塞队列
package test;import java.util.LinkedList;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class LinkedB...原创 2019-09-03 15:56:00 · 362 阅读 · 0 评论