多线程
ScottePerk
这个作者很懒,什么都没留下…
展开
-
Java多程序 CAS的原理和实现
我们知道要解决一个并发问题,可以给代码加synchronized关键字,这样就能保证数据保持同步,但synchronized存在一个问题,就是每次都会加锁,synchronized是使用操作系统底层的互斥锁(Mutex Lock)实现的,非常的销毁资源,这样就导致程序性能减低。我们称这种锁为悲观锁,悲观锁非常悲观也非常严格,认为并发的情况非常严重并且非常频繁,每次操作都要检查。但同时,JVM还提供了另外一种锁机制,这种锁机制认为,并发出现的概率并没有那么高,所以干脆不加锁,而是在出现并发的时候,数据回滚,并原创 2022-07-02 21:42:31 · 614 阅读 · 0 评论 -
Java多线程 Lock和synchronized的区别
1.synchronized是JVM级别的实现,Lock是代码级别的实现。2.synchronized用户不能修改,同时也更简洁。Lock用户可以自己实现,更加的灵活也更复杂。3.synchronized如果发生异常是会释放锁,而Lock需要手动释放,不然容易出现死锁。4.Lock的功能更加强大,可以实现非阻塞获取锁,超时获取锁等强大功能,缺点是如果没有用到这些功能,性能是不如synchronized。另外:Lock实际上是对synchronized的包装,功能更加强大,这并不意味着synchron原创 2022-07-01 16:46:33 · 433 阅读 · 0 评论 -
Java多线程 深入理解volatile关键字 volatile的使用和原理分析
volatile最重要的一个作用就是保证可见性。但不保证原子性。先简单说一下什么是可见性,可见性是指有多个线程共享同一个变量,那么其中任意一个线程修改了共享变量,其它的线程都能看到最新的数据,而不是自己的备份缓存。这就是可见性。 默认情况下,多线程共享变量是互相不可见的,也就是说,一个线程对于共享变量的修改,别的线程并不能获取到最新的值,这就会造成并发问题。volatile就是专门用来解决这种可见性问题的。synchronized也能保证可见性,而且还能保证原子性。也可以理解成volatile是一种简单版的原创 2022-07-01 15:55:17 · 437 阅读 · 0 评论 -
Java多线程之 happens-before
happens-before用来保证两个操作直接的可见性。这里的两个操作,即可以在一个线程,也可以在多个线程中。1.如果一个操作happens-before另一个操作,那么第一个操作的执行结果,将对第二个操作可见。(保证可见性)而且第一个操作的执行顺序排在第二个操作之前。(JMM对程序做出的逻辑保障,并不是代码指令真正的执行保证)2.即使两个操作之间存在happens-before关系,并不意味着Java平台的实现必须要按照happens-before关系指定的顺序执行。因此,第一条是JMM对于程序原创 2022-06-30 16:05:27 · 379 阅读 · 0 评论 -
Java多线程之 理解重排序
什么是顺序一致性模型?简单来说就是代码的执行顺序和代码的编写顺序是一致的。这样的好处就是结果是一致正确的。这也是符合冯诺依曼体系的。但是现代的多核心处理器没有采用这种结构,因为这个模型最大的问题就是相当于没有做任何优化。导致效率是非常低的,而现代多核心处理器的优化方式就是重排序。什么是重排序?重排序就是CPU优化代码的一种手段。替代指令的执行性能。主要有三种类型的重排序。1.编译器优化的重排序2.指令级并行的重排序3.内存系统的重排序整个执行的过程如下图所示。编译器在不改变程序在单线程环境下运行原创 2022-06-30 00:13:52 · 408 阅读 · 0 评论 -
Java多线程 Future和FutureTask的使用和源码分析(全解析)
官方文档解释:Future表示一个异步计算的结果。并提供一些方法检测计算是否完成,等待完成,并取回数据。只有计算完成的时候,结果可以通过get方法获取。如果没有完成,则调用get方法的时候会阻塞。官方文档是这么写的,翻译起来有点奇怪。直接看源码更好理解,Future是一个接口,总共就5个方法。详细解释看注释。Future只是一个接口,他的一个最主要实现类是FutureTask。FutureTask实现了RunnableFuture,那么RunnableFuture接口又是什么呢?Runnable原创 2022-06-29 14:11:04 · 595 阅读 · 0 评论 -
Java多线程基础八 两阶段终止设计模式(Two Phase Termination)
两阶段终止设计模式是一种优雅的终止线程的方式。两阶段指的是一个线程发送终止另一个线程的请求,另一个线程接受到请求终止自身并做相应的处理。即两阶段指的是请求阶段和处理阶段。比如我们要写一个系统监控程序,监控程序有死循环,每2s监控一次系统状况,没有中断的话会一直监控下去,如果有中断,就退出程序,并做一些保存工作。public class SystemMonitor { private Thread monitor; public void start() { monit原创 2022-04-19 15:31:55 · 266 阅读 · 0 评论 -
Java多线程基础七 interrupt方法
interrupt方法就是用来中断线程的。我们可以通过isInterrupted()判断线程是否已经中断了。中断分为正常中断和异常中断。下面先看异常中断:public class InteruptDemo1 { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new Runnable() { @Override原创 2022-04-19 15:14:35 · 881 阅读 · 2 评论 -
Java多线程编程六 join与线程同步
join方法的作用是让调用这个方法的线程对象执行完成后才会执行别的线程的代码。利用join等待线程完成。这里就要引出一个概念:线程同步/** * 利用join等待线程完成后执行 */public class JoinDemo1 { static int num=0; public static void main(String[] args) { Thread t1=new Thread(new Runnable() { @Override原创 2022-04-19 13:08:35 · 251 阅读 · 0 评论 -
Java多线程基础五 通过sleep防止CPU100%占用
在服务器中,会存在下面的while true方法,服务器需要一直接受请求,所以需要死循环一直运行着,如果没有添加sleep那么下面的代码会直接占用100%的cpu,导致别的应用没有执行权。这种情况叫做CPU空转如果加了sleep,哪怕sleep 1ms,cpu的占用率会降到3%左右(个人pc测试),总之就是会明显减低cpu使用率。while(true){ try { Thread.sleep(1); } catch (InterruptedException e) {原创 2022-04-19 02:17:19 · 2165 阅读 · 2 评论 -
Java多线程基础四 线程优先级之yield方法
yield单词是礼让的意思,是实现线程优先级的一种方式。线程调用yield会让出cpu的执行权,但别的线程不一定接受礼让。在cpu比较繁忙的时候效果明显,空闲的时候没什么影响。下面的例子,有A B两个线程,不断对count累加,B执行yield方法,B线程的count变量累加次数明显减少。没有yield方法的话,A B两个线程的累加次数差不多。/** * yield是礼让的意思,也就是让出线程cpu的执行权。 */public class YieldDemo1 { public stati原创 2022-04-19 01:53:58 · 1131 阅读 · 0 评论 -
Java多线程进程二 sleep方法的状态切换
调用sleep方法的时候会导致线程的状态从RUNNING变为TIME_WAITING。本文专门写个例子验证这个情况。只是为了验证而验证,下面的代码没有什么实战意义。代码主要逻辑:创建t1线程对象,sleep 2000ms,在main线程输出t1线程的状态。main线程sleep 500ms为了确保t1比main先执行。其实就是卡时间点。最开始的时候可能是RUNNABLE也可能是TIMED_WAITING,因为没有sleep,谁先谁后不确定。500ms的时候t1很可能处于TIMED_WAITING状态原创 2022-04-18 23:57:56 · 559 阅读 · 0 评论 -
多线程基础一 线程的创建
方法一:直接使用Thread代码非常简单,开启三个线程输出线程自己的名称。/** * 创建线程方法一 */public class CreateThreadDemo1 { public static void main(String[] args) { Thread t1 = new Thread("A") { @Override public void run() { System.out.原创 2022-04-18 23:45:28 · 227 阅读 · 0 评论 -
精通多线程实战-CountDownLatch
万丈高楼平地起,要精通也要一步步开始。先来学习concurrent包下的CountDownLatch这个类。1.为什么先学这个类?答:实用。我觉得这个类在实际的项目中是很有用的。下面提出几个实际开发中经常遇到的问题,当然这些问题的解决方案是很多的,这里主要还是为了讲解CountDownLatch类的使用。可能存在更好的解决方案,但这里只提供CountDownLatch这种解决方案。...原创 2018-12-18 00:46:18 · 270 阅读 · 0 评论 -
java 多线程详解一 多线程的简单使用
1.线程的三种启动方式: (1) 通过创建匿名内部类: public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println原创 2016-08-31 00:27:48 · 270 阅读 · 0 评论 -
java 多线程详解二 买票示例
问题描述:写一个卖票程序,假设有10张票(实际可能有几百万张),有3个窗口同时售票,打印显示卖出的每张票。(1)实现方式一(错误示例):public class Ticket implements Runnable { int num = 10; @Override public void run() { while (num>0) {原创 2016-08-31 00:28:22 · 557 阅读 · 0 评论