
多线程
文章平均质量分 52
用心去追梦
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
分布式事务——消息最终一致性方案
前言分布式事务一直是服务化拆分后一个绕不开的话题,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用。虽然服务化为我们的系统带来了水平伸缩的能力,然而随之而来挑战就是分布式事务问题,多个服务之间使用自己单独维护的数据库,它们彼此之间不在同一个事务中,假如A执行成功了,B执行却失败了,而A的事务此时已经提交,无法回滚,那么最终就会导致两边数据不一致性的问题;尽管很早之前就有基于两阶段提交的XA分布式事务,但是这类方案因为需要资源的全局锁定,导致性能极差;因此后面就逐渐衍生出了消息最终一原创 2021-10-14 23:21:31 · 346 阅读 · 1 评论 -
分布式事务的四种解决方案
简述分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。解决方案在分布式系统中,要实现分布式事务,无外乎那几种解决方案。一、两阶段提交(2PC)两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。运行过程1.1 准备阶段协调者询问参与者事务是否执行成功,参与者发回事务执行结果。1.2 提交阶段原创 2021-10-14 20:15:18 · 184 阅读 · 0 评论 -
揭开并发包底层AQS的神秘面纱
1、生活中案例场景介绍今天我们就举一个生活中的例子来理解下并发底层的AQS。大家如果去过某些大医院的话,就能知道,由于互联网的快速发展,医院的挂号、交费、取药的流程都是比较方便的,交费也可以使用支付宝、微信支付了,而不用带现金了。医生开完单子,交费完成 ,单子上都会有一个长条二维码,可以直接在取药的地方自助扫码,叫号系统自动分配取药窗口,然后你在关注下指定窗口等待着叫号就可以了,叫到你的时候再过去取药,而不需要一直在等待着。我们用一张图来直观的感受下:这里面涉及到了几个角色:1)药房,提供取药原创 2021-08-25 17:13:38 · 206 阅读 · 0 评论 -
Java7之线程池ForkJoinPool
许多情况下,在一个程序中使用多线程是有益处的,可以大大提高程序的效率,多线程主要有以下3个优点1,资源利用率更好2,程序设计在某些情况下更简单3,程序响应更快。当然凡事有利就有弊,多线程也会使程序的开发,维护及调试更加复杂,当然如果我们能够扬长避短,在正确的场合下使用多线程,那么它将成为我们程序中开发的利器。Java一直以来,对多线程的开发支持比较良好,特别在JDK5,6后引入的java.util.concurrent包,使用多线程的开发变的更加容易,这个包里面大部分的API都是更进一步的封装,作为开发者原创 2021-08-12 14:06:42 · 242 阅读 · 0 评论 -
腾讯面试题Java 并发包之线程池综述
Java 并发包之线程池综述■ 线程池的创建在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM资源是有限的,线程不能无限创建!从笔者开发经验来看,线程池应该是并发包中使用频率和运用场景最多的并发框架,几乎所有并发/异步执行任务的需求都需要用到线程池,线程复用,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务。合理的使用线程池可以带来如下三个好处: 1.降低资源消耗:通过重用原创 2021-08-07 10:51:12 · 187 阅读 · 0 评论 -
为什么阿里Java规约禁止使用Java内置Executors创建线程池?
IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒。告诉你手动创建线程池,效果会更好。在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有哪些参数及其意义。ThreadPoolExecutor 构造方法:复制代码public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue w原创 2021-07-24 21:42:11 · 2114 阅读 · 10 评论 -
synchronized锁的基本用法
在多线程的情况下 需要是同一个对象锁Synchronized(对象锁){需要保证线程安全的代码}1.修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码快前要获得 给定对象 的锁。2.修饰实例方法,作用于当前实例加锁,进入同步代码前要获得 当前实例 的锁3.修饰静态方法,作用于当前类对象(当前类.class)加锁,进入同步代码前要获得 当前类对象 的锁修饰代码块修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得 给定对象 的锁。public class ThreadCou原创 2021-07-07 14:39:19 · 390 阅读 · 0 评论 -
如何解决线程安全的问题
核心思想:上锁 分布式锁在同一个jvm中,多个线程需要竞争锁的资源,最终只能够有一个线程能够获取到锁,多个线程同时抢同一把锁,谁(线程)能够获取到锁,谁就可以执行到该代码,如果没有获取锁成功 中间需要经历锁的升级过程如果一致没有获取到锁则会一直阻塞等待。如果线程A获取锁成功 但是线程A一直不释放锁线程B一直获取不到锁,则会一直阻塞等待。代码从那一块需要上锁?-----可能会发生线程安全性问题的代码需要上锁。Juc并发编程 锁 重入锁 悲观锁 乐观锁 公平锁 非公平锁线程0 线程1 同时获原创 2021-07-07 14:25:57 · 143 阅读 · 0 评论 -
什么是线程安全问题
public class ThreadCount implements Runnable {private static Integer count = 100;@Overridepublic void run() { while (count > 1) { cal(); }}private void cal() { try { Thread.sleep(20); } catch (Exception e) { }原创 2021-07-07 14:04:02 · 103 阅读 · 0 评论 -
wait/notify/notifyAll在Object类中
wait/notify/notifyAll在Object类中因为我们在使用synchronized锁 对象锁可以是任意对象,所以wait/notify/notifyAll需要放在Object类中。wait/notify/简单的用法public class Thread03 extends Thread {@Overridepublic void run() {try {synchronized (this) {System.out.println(Thread.currentThread()原创 2021-07-02 11:39:04 · 328 阅读 · 0 评论 -
等待/通知机制
等待/通知的相关方法是任意Java对象都具备的,因为这些方法被定义在所有对象的超类java.lang.Object上,方法如下:1.notify() :通知一个在对象上等待的线程,使其从main()方法返回,而返回的前提是该线程获取到了对象的锁2.notifyAll():通知所有等待在该对象的线程3.wait():调用该方法的线程进入WAITING状态,只有等待其他线程的通知或者被中断,才会返回。需要注意调用wait()方法后,会释放对象的锁 。Exception in thread “Thread原创 2021-07-01 18:14:01 · 106 阅读 · 0 评论 -
多线程综合小案例
手写Callable与FutureTask模式可以基于Callable+FutureTask可以实现异步线程执行 带返回结果。LockSupport实现方式定义Callable+FutureTaskpublic interface MayiktCallable {V call();}public class MayiktFutureTask implements Runnable {private MayiktCallable mayiktCallable;private Thread c原创 2021-07-01 18:12:38 · 107 阅读 · 0 评论 -
Lock锁的基本使用
在jdk1.5后新增的ReentrantLock类同样可达到此效果,且在使用上比synchronized更加灵活相关API:使用ReentrantLock实现同步lock()方法:上锁unlock()方法:释放锁使用Condition实现等待/通知 类似于 wait()和notify()及notifyAll()Lock锁底层基于AQS实现,需要自己封装实现自旋锁。Synchronized —属于JDK 关键字 底层属于 C++虚拟机底层实现Lock锁底层基于AQS实现-- 变为重量级S原创 2021-07-01 18:11:04 · 3502 阅读 · 0 评论 -
正确的线程中止-标志位
在上方代码逻辑中,增加一个判断,用来控制线程执行的中止。public class Thread07 extends Thread {private volatile boolean isFlag = true;@Overridepublic void run() { while (isFlag) { }}public static void main(String[] args) { Thread07 thread07 = new Thread07(); th原创 2021-07-01 18:09:10 · 210 阅读 · 0 评论 -
如何安全的停止一个线程
调用stop方法Stop:中止线程,并且清除监控器锁的信息,但是可能导致 线程安全问题,JDK不建议用。 Destroy: JDK未实现该方法。Interrupt(线程中止)Interrupt 打断正在运行或者正在阻塞的线程。1.如果目标线程在调用Object class的wait()、wait(long)或wait(long, int)方法、join()、join(long, int)或sleep(long, int)方法时被阻塞,那么Interrupt会生效,该线程的中断状态将被清除,抛出Int原创 2021-07-01 18:05:57 · 464 阅读 · 0 评论 -
sleep防止CPU占用100%
sleep(long millis) 线程睡眠 millis 毫秒sleep(long millis, int nanos) 线程睡眠 millis 毫秒 + nanos 纳秒使用sleep方法避免cpu空转 防止cpu占用100%public static void main(String[] args) {new Thread(() -> {while (true) {try {Thread.sleep(30);} catch (InterruptedException e)原创 2021-07-01 18:04:55 · 960 阅读 · 0 评论 -
多线程优先级
1.在java语言中,每个线程都有一个优先级,当线程调控器有机会选择新的线程时,线程的优先级越高越有可能先被选择执行,线程的优先级可以设置1-10,数字越大代表优先级越高注意:Oracle为Linux提供的java虚拟机中,线程的优先级将被忽略,即所有线程具有相同的优先级。所以,不要过度依赖优先级。2.线程的优先级用数字来表示,默认范围是1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORTY.一个线程的默认优先级是5,即Thread.NORM_PRIORTY3.如果原创 2021-07-01 18:03:36 · 553 阅读 · 0 评论 -
多线程yield
主动释放cpu执行权1.多线程yield 会让线程从运行状态进入到就绪状态,让后调度执行其他线程。2.具体的实现依赖于底层操作系统的任务调度器public Thread02(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 50; i++) {if (i == 30) {System.out.println(Thread.currentThread().getName() + “,释原创 2021-07-01 18:02:07 · 229 阅读 · 0 评论 -
守护线程与用户线程
java中线程分为两种类型:用户线程和守护线程。通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程。如果不设置次属性,默认为用户线程。1.守护线程是依赖于用户线程,用户线程退出了,守护线程也就会退出,典型的守护线程如垃圾回收线程。2.用户线程是独立存在的,不会因为其他用户线程退出而退出。public class Thread01 {public static void main(String[] args) {Threa原创 2021-07-01 18:00:20 · 121 阅读 · 0 评论 -
多线程七种执行的状态
初始化状态就绪状态运行状态死亡状态阻塞状态超时等待等待状态start():调用start()方法会使得该线程开始执行,正确启动线程的方式。wait():调用wait()方法,进入等待状态,释放资源,让出CPU。需要在同步快中调用。sleep():调用sleep()方法,进入超时等待,不释放资源,让出CPUstop():调用sleep()方法,线程停止,线程不安全,不释放锁导致死锁,过时。join():调用sleep()方法,线程是同步,它可以使得线程之间的并行执行变为串行执行。yie原创 2021-07-01 17:58:06 · 287 阅读 · 0 评论