
Java多线程与高并发
文章平均质量分 73
多线程与高并发
phs999
这个作者很懒,什么都没留下…
展开
-
ThreadLocal线程局部变量-多线程与高并发
ThreadLocal线程局部变量,实现了将对象变量保存在特定的线程对象中,仅对当前线程可见。我们在测试程序中,一个线程往ThreadLocal对象中放置对象,然后另一个对象来取对象取不到。public class TestThreadLocal { static ThreadLocal <Person> tl = new ThreadLocal<>(); public static void main(String[] args) { new Thre原创 2020-10-17 22:21:36 · 194 阅读 · 0 评论 -
JUC之AQS原理-多线程与高并发
AQS是AbstractQueuedSynchronizer的缩写,该类是java.util.concurrent.locks包下的一个核心基础类,实现的功能主要是控制多个线程进行排队获得锁。AQS有很多具体的实现子类,比如ReentranLock、CountDownLatch、Semaphor拿ReentranLock来说,其主要代码逻辑是依靠其内部抽象类Sync具体实现。Sync是AbstractQueuedSynchronizer的子类。原创 2020-10-17 19:15:17 · 271 阅读 · 0 评论 -
生产者与消费者(Java实现固定容量的容器支持阻塞存取操作)-多线程与高并发
介绍生产者与消费者模型实现的两种思路,用Java实现固定容量的容器支持阻塞存取操作,一种是使用wait-notifyAll控制线程的阻塞和唤醒,另一种是进一步使用Condition进行优化,实现对消费者和生产者线程的区分唤醒。原创 2020-10-16 23:08:32 · 337 阅读 · 0 评论 -
JUC之LockSupport-多线程与高并发
LockSupport的意思就是有个变量控制线程的是否阻塞。对应有两个方法park()和unpark(thread)。park()是说当前线程执行该方法后进入阻塞状态,需要再调用unpark(thread)解除阻塞限制。如果unpark(thread)先于park()执行,则该次park()不起作用不会使得线程阻塞。package basic.aqs.LockSupport;import java.util.concurrent.TimeUnit;import java.util.concurr原创 2020-10-12 00:13:34 · 311 阅读 · 0 评论 -
JUC之Exchanger-多线程与高并发
Exchanger支持两个线程交换指定类型T的值(对象的话是交换引用,基本类型的话直接交换值)一个线程在执行exchange()方法后进入阻塞等待状态(也可以提前指定要等待的时间),等待另一个线程调用同一个exchanger对象的exchange()方法交换完成后,线程不再阻塞,可以继续执行后面的代码。package basic.aqs.Exchanger;import java.util.concurrent.Exchanger;/** * Exchanger支持两个线程交换指定类.原创 2020-10-09 23:58:33 · 943 阅读 · 0 评论 -
JUC之ReadWriteLock-多线程与高并发
ReadWriteLock读写锁目前有两种实现,一种是ReentrantReadWriteLock类,一种是StampedLock。package basic.aqs.readWriteLock;import java.util.Random;import java.util.concurrent.atomic.LongAdder;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadW.原创 2020-10-09 23:49:39 · 145 阅读 · 1 评论 -
JUC之Semaphore-多线程与高并发
我们学习锁的时候,当一个线程获取到锁,它才可以正常执行;未获得锁的线程阻塞。而Semaphore也相当于锁,不过它可以定义锁的数量,即同一时间可以控制让多个线程都获得锁从而正常运行。它控制同一时间点并发执行线程的个数。也可以控制某个资源可被同时访问的个数。主要用于限流。用法就是一个acquire()方法用于获得锁,如果没有获得锁则线程阻塞;另一个方法就是release()方法,线程执行完成后释放锁。初始化时可以传参指定控制并发的数量。Semaphore s = new Semaphore(原创 2020-10-09 22:48:30 · 235 阅读 · 0 评论 -
JUC之Phaser-多线程与高并发
Phaser支持对于多个线程,阻塞控制统一完成到某个阶段后,再继续进行下一阶段的操作。即所有线程都完成当前阶段后,才可以进入下一阶段进行操作。以一个婚礼流程为例,比如分为到场、吃饭、离场等流程,必须所有人步调一致,人到齐才能开饭。p0 到达现场!新娘 到达现场!p3 到达现场!p1 到达现场!p2 到达现场!新郎 到达现场!p4 到达现场!所有人到齐了!7新娘 吃完!p2 吃完!p0 吃完!p1 吃完!p3 吃完!p4 吃完!新郎 吃完!所有人吃完了!7p3原创 2020-10-08 19:55:14 · 283 阅读 · 1 评论 -
JUC之CountDownLatch、CyclicBarrier-多线程与高并发
CountDownLatch实现了通过一个计数,来控制一个或多个线程是否需要一直阻塞等待。CyclicBarrier实现了通过一个计数,控制每满多少就进行一些操作,可用于多线程计算数据,最后汇总结果的场景。原创 2020-10-08 17:03:56 · 172 阅读 · 0 评论 -
volatile的线程可见性和禁止指令重排序-多线程与高并发
保证线程可见性-MESI-缓存一致性协议禁止指令重排序-DCL单例-Double Check LockObject o=new Object();new一个对象的三个步骤:a.开辟内存空间b.初始化、赋值c.将堆内存空间的地址赋给栈里的对象引用o。验证线程可见性的程序:/** * volatile 关键字,使一个变量在多个线程间可见 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必...原创 2020-10-06 13:54:55 · 322 阅读 · 0 评论 -
详解synchronized关键字(无锁、偏向锁、轻量级锁(自旋锁)、重量级锁四种锁状态)-多线程与高并发
介绍CAS(compare and swap)、对象内存分布、markword、synchronized中锁的状态(无锁、偏向锁、轻量级锁、重量级锁)研究、Java Object Layout原创 2020-09-26 14:11:26 · 1642 阅读 · 0 评论 -
啥是可重入锁,Synchronized与ReentrantLock-多线程与高并发
一个synchronized修饰的方法调用另一个synchronized修饰的方法,可以吗?介绍可重入锁的概念及两种实现方式(ReentrantLock和synchronized)原创 2020-09-17 23:35:51 · 459 阅读 · 0 评论 -
没写完就读产生脏读(写操作加锁读操作不加锁产生脏读)synchronized-多线程与高并发
模拟银行账户,对业务写方法加锁,对业务读方法不加锁,这样有什么后果?因为这种情况不能保证写操作完成后再进行读操作,没写完就读容易读到不准确的中间态数据,即产生脏读。/** * 模拟银行账户 * 对业务写方法加锁 * 对业务读方法不加锁 * 这样行不行? * * 容易产生脏读问题(dirtyRead) */package main.java.basic._synchronized;import java.util.concurrent.TimeUnit;pu...原创 2020-09-17 22:32:01 · 591 阅读 · 0 评论 -
Synchronized常见写法-多线程与高并发
线程安全本质上是多个线程操作同一数据,要保证数据的准确。而Synchronized提供了线程互斥访问,同一时刻只能有一个线程来执行特定方法实现对数据的操作。Synchronized修饰的可以是新建对象、当前对象this、成员方法、当前类的class对象、静态成员方法。原创 2020-09-17 04:14:33 · 309 阅读 · 0 评论 -
线程的状态与sleep()、yield()、join()方法-多线程与高并发
目录1、线程的状态:2、sleep、yield、join1、线程的状态:Thread类中有一个内部枚举类State,枚举了6种线程的状态。/** * A thread state. A thread can be in one of the following states: * <ul> * <li>{@link #NEW}<br> * A thread that has not yet start原创 2020-09-14 00:40:35 · 204 阅读 · 0 评论 -
run()和start()有啥区别,用run()启动线程行不行?以及创建线程的两种方法总结-线程与高并发
1、我用run()启动线程,不用start()行不行?2、创建线程的两种方式中,都调用start()方法了,但有什么区别呢?原创 2020-09-11 00:33:59 · 170 阅读 · 0 评论 -
java并发编程-1.3线程的简单中断
Thread类有一个表明线程是否被中断的属性值(boolean)。线程的interrupt()方法被调用时,该属性值被设置为true。isIterrupted()方法只是返回这个属性的值。PrimeGenerator类:package sec01;//线程的中断实例public class PrimeGenerator extends Thread{ @Overrid原创 2017-06-04 00:28:23 · 354 阅读 · 0 评论 -
java并发编程-1.2线程信息获取和设置(ID,名称、优先级、状态)
乘法表运算显示在控制台上,每个线程的状态改变记录在log.txt中。代码如下:package sec01;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;//线程信息的获取和设置public class Calculator2 implements R原创 2017-06-03 18:57:05 · 2161 阅读 · 0 评论 -
java并发编程-1.1线程的创建方法及比较
在java语言中,线程和其他所有元素一样,都是对象。java提供了两种方式来创建线程:继承Thread类,并重写run()方法; 在类中实现Runnable接口,并实现run()抽象方法。使用带参数的Thread构造方法来创建Thread对象。该参数就是实现runnable接口的类的一个对象。继承Thread类的实现:public class Calculator extend...原创 2017-05-24 20:00:46 · 233 阅读 · 0 评论