![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
小曹的blog
这个作者很懒,什么都没留下…
展开
-
join和CountDownLatch的区别
join用于让当前线程等待join线程执行结束,例如:t.join()指的是等待t线程执行结束在执行其他线程其原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远wait。countDownLatch没有这个线程,只要count减小到0,不管被等待线程是否执行结束,等待线程都可以继续执行(被唤醒,进入可执行状态)。...原创 2021-08-31 21:41:36 · 382 阅读 · 0 评论 -
死锁的产生原因及必要条件
死锁问题多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。死锁的概念所谓死锁是指两个或两个以上的线程在执行过程中,因争夺资源而导致的一种互相等待的现象,若无外力作用,它们都将无法推进下去。怎么检测一个线程是否拥有锁?在java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁。死锁产生的原因系统资源的竞争。通常系统中拥有不可剥夺资源,其数量不足以满足多个进程运行的需要,使原创 2021-08-29 16:10:24 · 218 阅读 · 0 评论 -
synchronized和Lock比较
Synchronized和Lock都是可重入锁,但synchronized不是可中断锁,而Lock是可中断锁。Synchronized底层:使用指令码方式来控制锁的,映射成字节码指令就是增加两个指令:monitorenter和monitorexit。当线程执行遇到monitorenter指令时会尝试获取内置锁,如果获取锁则锁计数器加1,如果获取锁则阻塞;当线程遇到monitorxit指令是则锁计数器-1,如果计数器为0则释放锁。Lock的底层:是CAS乐观锁,依赖AbstractQueued..原创 2021-08-29 15:19:01 · 348 阅读 · 0 评论 -
练习:编写10个线程,第一个线程从1加到10,第二个线程从11加到20...第十个线程从91加到100,最后再把十个线程结果相加
实现方式1:定义一个10个长的FutureTask[],使用Callable接口,因为future.get()可以阻塞当前线程的执行package com.cao3;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;public class Test4 { public static void .原创 2021-08-05 17:49:51 · 906 阅读 · 0 评论 -
sleep和wait的比较
waitSleep同步只能在同步上下文中调用wait方法,否则抛出IllegalMonitorStateException不需要在同步方法或同步块中调用作用对象wait方法定义在Object类中,作用于对象本身sleep方法定义在Thread中,作用于当前线程释放锁资源是否唤醒条件其他线程调用对象的notify()或者notifyAll()方法超时或者调用interrupt()方法体方法属性wait是实例方法sleep是静态方法Java...原创 2021-08-05 15:11:28 · 48 阅读 · 0 评论 -
线程状态转换图及其5种状态切换
线程的状态切换图:线程变化的5状态转换:新建状态(New):新创建了一个线程对象。就绪状态(Runable)/可运行状态:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可执行的线程池中,变得可执行,等待获取CPU的使用权。执行状态(Running )/运行状态:就绪状态的线程获得了CPU。执行程序代码。阻塞状态(Blocked):阻塞状态的线程由于某种原因被迫放弃了CPU的使用权。临时停止执行,指导线程进入就绪状态,才有机会转到执行状态。阻塞的情原创 2021-08-04 22:16:05 · 7189 阅读 · 0 评论 -
java线程四种实现方法
线程的四种实现方法1.继承Thread类2.实现Runnable接口3.使用Callable和Future接口创建线程4.使用线程池创建线程总结1.继承Thread类 Thread类本质上是实现了Runnable接口的一个实例,代表一个 线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extends Thread,并复写run()方法,就可原创 2021-08-04 15:55:52 · 148 阅读 · 0 评论