![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA多线程
文章平均质量分 50
万事无Bug
南昌大学 低调学Java
展开
-
Java之volatile关键字
Java之volatile关键字简述:volatile是JVM提供的轻量级的同步机制,其具有以下特点:1、保证可见性2、不保证原子性3、禁止指令重排保证可见性我们知道,JMM(一种抽象的Java内存模型)中规定,线程不能直接在内存中操作变量,每一个线程操作对象必须先从内存中获取变量的值,然后在本线程的工作内存中操作数据,操作结束后再将变量写入主内存,从而完成对内存中变量的修改。但是多线程下,线程A,B都从中获得同一个变量,但A对变量进行修改后,B线程并不知道,仍用原来的数据进行修改。这就是线原创 2021-08-19 22:51:27 · 236 阅读 · 0 评论 -
指令重排序
指令重排序前言:学过java的小伙伴都知道,volatile关键字在Java中作为处理并发事务是经常被提起的,而volatile关键字有一个关键点就是禁止指令重排序,这里呢我就给大家简单介绍一下什么是指令重排序,以及指令重排序的好处!!什么是重排序:为了提高效率,编译器和处理器会将既定代码的执行顺序进行指令的重新拍戏目的:在不改变执行结果的前提下,尽量通过指令的重排序,提高处理指令的性能。重排序优势的例子:如上图,指令顺序改变,但是CPU操作次数减少,且执行结果不变,这就是指令重排带来的好原创 2021-08-19 22:47:15 · 167 阅读 · 0 评论 -
Java多线程之线程通信(信号灯法)
Java多线程之线程通信(信号灯法)用通俗的语言简述一下信号灯法:在生产者消费者模式中,信号灯,顾名思义,是用来在生产者与消费者之间传递信号的一个旗帜。如在一个生产与消费模式中,当生产者或消费者线程完成自己的工作,等待另一个线程进行时,便会**将信号值修改用以告诉另一者:我的事情做完了,该你了。**而另一者获取信号的变化后便会做出对应的行为。在这个过程中,信号值一直被反复更改,直到所有线程均执行完毕。我们用代码来解释一下:(ps:代码中以小米公司耍猴和米粉们抢购RedmiK40手机为例子~~~)p原创 2021-03-23 22:19:11 · 571 阅读 · 0 评论 -
Java之线程通信(管程法)
生产者消费者问题(管程法)线程通信最典型的一个应用场景就是生产者消费者问题。这里我们用java代码来模拟出生产者消费者之间的通信。首先介绍一下管程法:管程法在生产者消费者模式中,其实就是建立一个缓冲区,让生产者将生产产品(数据)放入缓冲区,而消费者从缓冲区获取产品。生产者和消费者之间不直接进行通信。Java实现代码如下(代码均有详细注释,不过多赘述):package com.zm.thread;import static jdk.nashorn.internal.objects.Native原创 2021-03-23 20:39:50 · 203 阅读 · 0 评论 -
Java多线程之Lock锁
Java多线程之Lock锁在我们学习synchronized之后,我们知道了两种办法对进程内对象加速,使得我们的数据安全,一个就是synchronized方法锁,这可以直接对一个方法进行同步,简单除暴,但是仅能获取方法造作的this对象的锁。而另一个就是synchronized代码块,可以对我们选中的代码进行同步,相比第一种,它可以操作不同的对象。但相比与前两者,我现在要说的是另外一种,Lock锁。Lock锁由我们手动开启和关闭,且Lock没有方法锁,只有代码块锁。使用Lock锁,JVM将花费更少的原创 2021-03-22 21:55:03 · 133 阅读 · 0 评论 -
Java多线程之死锁
标题Java多线程之死锁死锁是什么:死锁指多个线程互相拥有对方所需要的资源,形成僵持,均因缺少资源无法继续向下运行举个栗子:假设家中只有1本记事本,和1支钢笔,哥哥和弟弟同时都要写作业,那么他们需要同时拥有这两样东西才能进行作业,但是如果哥哥拿了其中一样,弟弟拿了另外一样,然后两个人都在等待获得对方的物品,那么这就造成死锁了。栗子的代码如下://死锁指多个线程互相拥有对方所需要的资源,形成僵持,均因缺少资源无法继续向下运行public class DeadLock { public s原创 2021-03-22 21:03:07 · 98 阅读 · 0 评论 -
Java多线程之synchronized同步块
Java多线程之synchronized同步块首先我们用一个银行取钱的多线程例子来讲解。一对夫妻有一个共同的家庭存折,他们同时要在银行取钱。java代码如下:public class Bank { public static void main(String[] args) { Account account=new Account(100,"家庭存折"); Drawing man =new Drawing(account,50,"丈夫"); Dr原创 2021-03-22 14:44:04 · 293 阅读 · 8 评论 -
Java线程并发与同步
Java之线程并发我们知道,多线程存在着数据安全问题。在并发线程中,一个对象同时可以被多个线程访问,修改等。比如购买火车票的例子,若只剩下最后一张火车票,但此时同时有多个线程正在访问该数据,那么如果不加约束,那么这些线程都将成功购得同一张火车票,最后导致系统中火车票剩余数量变为负数!以下是一个不加约束的示范://线程并发即多个线程操作同一个对象//买火车票的例子public class TestThread3 implements Runnable{ private int ticket=原创 2021-03-21 22:23:18 · 406 阅读 · 0 评论