Java多线程&并发
问而知
向Java提问,探寻代码内含的意蕴
展开
-
问十一:sleep和wait的区别有哪些?
sleep与wait的区别1. 这两个方法来自不同的类分别是Thread.wait()和Object.sleep()2. sleep必须捕获异常,而wait不需要捕获异常3. wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用4. 最主要是Thread.sleep方法只会让出CPU资源,而没有释放锁,Object.wait方法不仅让出了CPU资源,也释...原创 2019-05-02 16:28:40 · 169 阅读 · 1 评论 -
问二十七:ThreadLocal源码解析
ThreadLocal概述:ThreadLocal是一个本地线程副本变量工具类,运用到了线程封闭技术。用来维护线程中的变量不被其他线程干扰而出现的一个结构,内部包含一个ThreadLocalMap类(该类由一个继承自虚引用的Entry来存具体的值,需要留意还有一个用来存Entry的table数组),该类为Thread类的一个实例属性(非static的成员变量),该Entry存储的key为T...原创 2019-05-03 08:35:59 · 186 阅读 · 0 评论 -
问二十八:说说双端队列(Deque )与工作密取(Work Stealing)?
Java6增加了两种容器类型,Deque(发音为“deck”)和BlockingDeque,它们分别对 Queue和BlockingQueue进行了扩展。Deque是一个双端队列,实现了在队列头和队列尾的髙. 效插入和移除。具体实现包括ArrayDeque和LinkedBlockingDeque。正如阻塞队列适用于生产者-消费者模式,双端队列同样适用于另一种相关模式,即工作 密取(Work...转载 2019-05-03 08:36:36 · 481 阅读 · 0 评论 -
问一:进程和线程间通讯方式?
操作系统层面的进程间通讯①管道存在于内存中,进程可以对它进行读写,提供流控机制,保证进程的正确读写(管道为空读阻塞,管道为满写阻塞)②消息队列类似于管道,但不止能够传输字节流,没有缓冲区大小限制。同时独立于进程,进程终止时消息队列及其内容不会被删除,实现消息随机读取③套接字(socket)可用于不同机器间的进程通信(即网络间进程通信)④信号量(Semaphore)一...原创 2019-05-01 10:10:32 · 167 阅读 · 0 评论 -
问二:线程安全诱因及概念?
线程安全性的定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。主要诱因:存在可变的共享数据,并且同时有多条线程共同操作这些资源实现线程安全:线程封闭:线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。...原创 2019-05-01 10:11:07 · 134 阅读 · 0 评论 -
问三:产生死锁的四个条件?
Java多线程中的死锁死锁是指两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。死锁的发生必须满足以下四个条件:互斥条件:一个资源每次只能被一个进程使用请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺循环等待条件:若干进程之间形成一...转载 2019-05-01 10:11:31 · 181 阅读 · 0 评论 -
问四:进程与线程的区别?
两者区别:1.资源拥有:进程是资源分配的最小单位,线程是CPU调度的最小单位,同一个进程中的线程共享本进程中的资源(如内存、CPU、IO等),进程间资源独立2.地址空间:同一个进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间3.执行方面:进程可以看做一个独立应用来单独执行,而线程则必须依托与进程执行4.系统开销:进程切换消耗资源更多、开销更大(用户态与内核态的切换)...原创 2019-05-01 10:12:01 · 155 阅读 · 0 评论 -
问五:JAVA线程的六种状态及所有切换途径?
参考源码注解进行修改添加Thread.State六个状态详解新建(New):创建后还没有启动的线程状态运行(Runnable):线程正在JVM中执行的状态,但它可能正在等待来自操作系统的其他资源(例如处理器资源)因此包含Running和Ready状态阻塞(Blocked):处于阻塞状态的线程正在等待monitor锁的状态无限期等待(Waiting):不会分配CPU执行时...原创 2019-05-01 10:12:37 · 170 阅读 · 0 评论 -
问六:实现线程的四种方式?
1.继承Thread类创建线程2.实现Runnable接口创建线程3.使用Callable和Future创建线程4.通过线程池实现线程创建的目的注:一般实现接口创建接口* Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口;* 类可能只要求可执行就行,继承整个 Thread 类开销过大。1)继承Thread类创建线程...原创 2019-05-01 10:13:29 · 157 阅读 · 0 评论 -
问七:如何中断一个线程?
已经被抛弃的方法:通过调用stop()通过调用suspend()和resume()方法废弃原因(再写具体一点):太过暴力,可能会导致一些清理工作不会完成调用后会直接释放锁,可能会导致数据不同步的问题https://www.jianshu.com/p/e0ff2e420ab6目前使用的方法:调用interrupt(),通知线程应该中断1.如果线程处于阻塞状...原创 2019-05-01 10:14:03 · 706 阅读 · 0 评论 -
问八:InterruptedExcption详细分析?
当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法抛InterruptedException的代表方法有:1. java.lang.Object 类的 wait 方法2. java.lang.Thread 类的 sleep 方法3. java.lang.Thread 类的 join 方法需要...原创 2019-05-01 10:14:25 · 417 阅读 · 1 评论 -
问九:源码层面解析Thread.sleep()为什么需要抛异常?
结合此篇文章进行阅读:InterruptedExcption详细分析导入:Thread.sleep()抛的是InterruptedException,这个错误在源码中的注释为:* Thrown when a thread is waiting, sleeping, orotherwise occupied,* and the thread is interrupted, e...原创 2019-05-01 10:15:05 · 7035 阅读 · 2 评论 -
问二十六:各种变量在多线程中的共享状态?
静态方法:属于类本身的一部分,在类装载的时候被加载到内存,不会进行销毁,会一直存在内存中,知道JVM关闭非静态方法:即实例方法,属于实例对象的一部分,实例化后才会分配内存,必须通过类的实例来引用,不会常驻内存,当实例对象被JVM回收后跟着消失静态变量:非线程安全。静态变量即类变量,位于方法区,被与该类有关的所有对象所共享,共享一份内存实例变量:部分单例模式(不做特殊处理)非线程安全,非...原创 2019-05-03 08:35:18 · 274 阅读 · 0 评论 -
问二十五:long、double是原子操作吗?
当线程在没有固步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值。这种安全性保证也被称为最低安全性( out-of-thin-air safety)最低安全性适用于绝太多数变量,但是存在一个例外:非volatile类型的64位数值变量。Java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非volatile类型的long和doub...原创 2019-05-03 08:35:01 · 1039 阅读 · 1 评论 -
问二十四:分类说明JUC包常用类有哪些?
JUC中常用类汇总JUC的atomic包下运用了CAS的AtomicBoolean、AtomicInteger、AtomicReference等原子变量类JUC的locks包下的AbstractQueuedSynchronizer(AQS)以及使用AQS的ReentantLock(显式锁)、ReentrantReadWriteLock附:运用了AQS的类还有:Semaphore、Co...原创 2019-05-03 08:34:11 · 2534 阅读 · 0 评论 -
问十二:说说你了解到的java线程池?
1.线程池优点第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。2. 源码分析 1)线程池的创建在创建线程池时会...原创 2019-05-02 16:29:40 · 246 阅读 · 0 评论 -
问十三:synchronized底层实现是什么样的?
早期synchronized:Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。这种依赖于操作系统Mutex Lock所实现的...原创 2019-05-02 16:31:16 · 224 阅读 · 0 评论 -
问十四:说说synchronized的膨胀方向?
synchronized的四种状态无锁、偏向锁、轻量级锁、重量级锁锁膨胀方向:无锁→偏向锁→轻量级锁→重量级锁偏向锁:减少同一线程获取锁的代价多数情况下,锁不存在多线程竞争,总是由同一线程获得如果一个线程获得了锁,那么锁就进入偏向模式,此时Mark Word的结构就变成了偏向锁结构,当该线程再次请求锁时,无需再做任何同步操作,获取锁的过程只需要检测Mark Word的锁标...原创 2019-05-02 16:32:25 · 298 阅读 · 0 评论 -
问十五:说说你了解的volatile?
volatile作用,实现原理,运用场景:①作用:volatile只能保证多线程三大特性中的可见性和有序性。1)可见性:每个线程都有一个自己的本地内存,对于共享变量,线程每次读取和写入的都是共享变量在本地内存中的副本,然后在某个时间点将本地内存和主内存的值进行同步。而当修改volatile修饰的变量后,volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,会强制把对变量的修改...原创 2019-05-02 16:33:01 · 268 阅读 · 0 评论 -
问十六:synchronized与volatile的区别?
1)volatile本质是告诉JVM当前变量在寄存器中的值是不确定的,需要从主存中读取,不会造成线程阻塞。synchronized则是锁定当前变量,只有当前线程可以访问该变量,其它线程被阻塞。2)volatile仅能使用在变量级别,synchronized则可以使用在变量、方法。3)volatile仅能实现变量修改的可见性,而synchronized则可以保证变量修改的可见性和原子性。...原创 2019-05-02 16:33:29 · 369 阅读 · 0 评论 -
问十七: synchronized与lock的区别是什么?
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;...原创 2019-05-02 16:34:52 · 212 阅读 · 0 评论 -
问十九:yield函数的作用?
* A hint to the scheduler that the currentthread is willing to yield* its current use of a processor. The scheduleris free to ignore this* hint.hint:暗示scheduler:调度器yield:退让,让出is free...翻译 2019-05-02 16:35:49 · 435 阅读 · 0 评论 -
问二十:说说notify和notifyAll的区别?
synchronized的底层实现monitor它有两个字段:EntryList和WaitSet锁池(EntryList)如果线程A拥有了某个对象的锁的话,其他线程B、C想调用这个对象的synchronized方法(或者进入方法块)的话,就必须获得该对象锁的拥有权。而这时该对象的锁被线程A锁占用,因此B、C线程就会被阻塞,进入到一个地方等待锁的释放,这个地方就是锁池。等待池(...原创 2019-05-02 16:36:15 · 293 阅读 · 0 评论 -
问二十一:说说CAS是什么(概念)?
如果要深入了解Java中的具体实现:CAS原理(以AtomicInteger为例)导入synchronized这样的锁是悲观锁,始终假定会发生并发冲突,会屏蔽一切可能违反数据完整性的约束乐观锁假设不会发生并发冲突,所以它只会在提交时检查是否保证数据完整性,如果提交失败则会进行重试,而最常见的就是CAS(Compare and Swap)了CAS一种高效实现线程安全性的方法...原创 2019-05-03 08:31:14 · 1382 阅读 · 0 评论 -
问二十二:说说CAS是什么(原理)?
关于概念:CAS的概念及注意事项拿AtomicInteger的incrementAndGet()来举例:先是一些字段:附:自己要拿Unsafe实例需要通过反射获取原创 2019-05-05 10:54:57 · 302 阅读 · 0 评论 -
问二十三:说说闭锁、栅栏、信号量是什么?
CountDownLatch的作用与使用场景:作用:允许一个或多个线程等待,直到其他线程的一组事件完成(是一次性对象,一旦进入终止状态就不能被重置)原理:CountDownLatch是一种闭锁的实现,它可以使一个或多个线程等待一组事件发生闭锁状态包括一个计数器,初始化为一个正数,用来表示需要等待的事件数量countDown()递减计数器,表示有一个事件巳经发生await...原创 2019-05-03 08:33:35 · 380 阅读 · 0 评论 -
问十:源码层面解析Thread中run()和start()的区别?
分析start()的源码:调用start0()方法 是一个native方法进入http://hg.openjdk.java.net/jdk8u源码页查看其native方法的源码进入share目录,找到Thread.c发现其调用了JVM_StartThread方法通过查看其顶部引用,定位jvm.h进入jvm.h进行查看在JVM_S...原创 2019-05-01 10:15:34 · 284 阅读 · 0 评论