![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
云养猫v2
这个作者很懒,什么都没留下…
展开
-
ThreadLocal分析
用法案例public class ThreadLocalTest { private static ThreadLocal<Integer> threadLocal1 = new ThreadLocal<Integer>() { @Override protected Integer initialValue() { return Integer.valueOf(0); } }; p转载 2020-06-06 19:43:15 · 151 阅读 · 0 评论 -
三个线程交替打印ABC
public class ABC { private static final Lock lock = new ReentrantLock(); private static final Condition conditionA = lock.newCondition(); private static final Condition conditionB = lock.n...原创 2020-04-01 16:58:16 · 190 阅读 · 0 评论 -
Condition.await() signal()的原理 AQS
class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new ...转载 2020-03-21 15:06:48 · 357 阅读 · 0 评论 -
synchronized 锁膨胀
baised_lock为0表示偏向锁不可用。ptr_to_lock_record 表示指向锁记录空间的指针ptr_to_heavyweight_monitor 指向monitorObject的指针锁一共有4种状态:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态偏向锁大多数情况下,锁不仅不存在多线程竞争,而且总是由同一个线程多次获得。(这时baised_lock为1)当锁...转载 2020-03-19 22:06:13 · 228 阅读 · 0 评论 -
synchronized关键字原理
synchronized 称为Java内置锁、隐式锁。因为synchronized是JVM实现的。synchronized实现同步的基础:Java中每一个对象都可以作为锁。具体表现:对于普通同步方法,锁是this对象对于同步方法块,锁是synchronized括号里配置的对象对于静态同步方法,锁是当前类的Class对象代码块同步是使用monitorenter和monitorexit指...转载 2020-03-19 19:50:36 · 255 阅读 · 0 评论 -
java实现死锁
public static void main(String[] args) { final Object a = new Object(); final Object b = new Object(); Thread threadA = new Thread(new Runnable() { public void run(...原创 2020-03-18 15:58:04 · 83 阅读 · 0 评论 -
happens-before规则
程序顺序规则:一个线程中的每个操作,happens-before于该线程的任意后续操作。监视器锁规则:对一个锁分解锁,happens-before于随后对于这个锁的加锁。volatile变量规则:对于一个volatile域的写,happens-before于任意后对于这个volatile域的读。传递性:如果A happens-before B,且B happens-before C,那么A...原创 2020-03-16 17:02:20 · 114 阅读 · 0 评论 -
如何保证线程安全(线程同步)
互斥同步(悲观策略)同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者时一些,使用信号量的时候)线程使用。synchronizedReentrantLock非阻塞同步(乐观策略)互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能问题。:基于冲突检测的乐观并发策略,通俗的说,就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了。CAS操作 ...原创 2020-03-14 17:50:34 · 644 阅读 · 0 评论 -
Thread的start()和run()执行的区别
/** * Causes this thread to begin execution; the Java Virtual Machine * calls the <code>run</code> method of this thread. * <p> * The result is that two threads a...原创 2020-03-12 22:50:04 · 101 阅读 · 0 评论 -
Java内存模型
处理器、高速缓存、主内存之间关系为了能够使CPU内部的运算单元能尽量被充分利用,CPU处理可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果时一致的,但不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致。Java内存模型主内存与工作内存共享变量包括:实例字段、静态字段和...原创 2020-03-05 17:20:43 · 77 阅读 · 0 评论 -
Thread的run()与start()的区别
Java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程多线程原理:相当于玩游戏机,只有一个游戏机(CPU),可是有很多人要玩,于是,star...转载 2020-03-04 18:25:29 · 83 阅读 · 0 评论 -
CAS
Compare-And-Swap Set…CAS指令需要3个操作数,分别是内存位置(在Java中可以简单的理解为变量的内存地址,用V表示),旧的预期值(用A表示)和新值(用B表示)。CAS指令执行时,当且仅当V符合旧的预期值A时,处理器用新值B更新V的值,否则它就不执行更新,但是无论是否更新了V的值,都会返回V的旧值,上述的处理过程是一个原子操作。利用循环CAS实现原子操作的问题ABA问...原创 2020-03-04 17:16:14 · 161 阅读 · 0 评论 -
AQS相关
public abstract class AbstractOwnableSynchronizer { private transient Thread exclusiveOwnerThread;}public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer { stat...原创 2020-01-14 19:05:24 · 88 阅读 · 0 评论 -
线程中断interrupt
Interrupt status & InterruptedExceptionjava中对于终端的大部分操作无外乎一下两点:.设置或清除中断标志位抛出InterruptedExceptioninterrupt status在java中,每一个线程都有一个中断标志位,表征了当前线程是否处于被终端状态,我们可以把这个标识理解成一个boolean类型的变量,当我们中断某一个线程是,...转载 2019-09-17 21:19:46 · 282 阅读 · 0 评论 -
AQS,AbstractQueuedSynchronizer 下 (独占锁的释放)
Example: ReentrantLock的锁释放由于锁的释放操作对于公平锁和非公平锁都是一样,所以,unlock的逻辑并没有放在FairSync或NonfairSync里面,而是直接定义在ReentrantLock类里:public void unlock() { sync.release(1);}releaserelease方法定义在AQS类中,描述了释放锁的流程pub...原创 2019-09-16 22:30:57 · 148 阅读 · 0 评论 -
AQS,AbstractQueuedSynchronizer 上 (独占锁的获取)
head节点在不为null的时候,head所指向的Node的prev是指向该Node自己的。 /** * Inserts node into queue, initializing if necessary. See picture above. * @param node the node to insert * @return node's predecesso...转载 2019-09-11 21:55:38 · 110 阅读 · 0 评论 -
保证"线程池中的所有的线任务都完成后,主线程才会继续向下执行"
public static void main(String[] args){// ExecutorService executorService = Executors.newFixedThreadPool(10); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, ...原创 2019-08-23 21:39:07 · 1254 阅读 · 0 评论 -
Condition.await, signal 与 Object.wait, notify 的区别
Condition.await() 对应于 Object.wait()Condition.signal() 对应于 Object.notify ()Condition.signalAll() 对应于 Object.notifyAll()不同的是Object wait,notify 对应的是 synchronized 方式的锁,Condition await...原创 2019-03-20 20:31:22 · 743 阅读 · 0 评论 -
ReentrantLock
特点:1,可重入,排他,2,有公平锁与非公平锁公平锁保证了锁的获取按照FIFO原则,而代价是进行大量的线程切换。而非公平锁虽然可能造成线程“饥饿”,但极少的线程切换,保证了其更大的吞吐量。ReentrantLock 实现了 Lock接口public class ReentrantLock implements Lock, java.io.Serializable {...原创 2019-03-20 19:38:35 · 58 阅读 · 0 评论 -
ThreadLocal
ThreadLocal变量的基本原理是,同一个ThreadLocal所包含的对象(对ThreadLocal<String>而言即为String类型变量),在不同的Thread中有不同的副本(实际是不同的实例)。注意几点: 1. 因为每个Thread内有自己的实例副本,且该副本只能由当前Thread使用。这也是ThreadLocal命名的由来。 2. 既然每个Thr...原创 2019-02-20 16:00:22 · 90 阅读 · 0 评论 -
Lock接口
public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; //可中断地获取锁 boolean tryLock(); //尝试非阻塞的获取锁 boolean tryLock(long time, TimeUnit unit) t...原创 2019-02-20 16:37:11 · 67 阅读 · 0 评论 -
JUC下的原子类实现原理
volatile不能解决num++这类复合类操作的原子性问题,相比锁机制,使用原子类更精巧。 悲观的解决方案(阻塞同步): num++操作,1.读取 2. 加一 3. 写入 三步组成的,就是复合类的操作,在并发环境下,如果不做不做何人同步处理,就会有线程安全问题。最直接的处理方式就是加锁。synchronized(this) { num++;}...原创 2019-02-22 15:25:23 · 686 阅读 · 0 评论 -
Java线程的几种状态
原创 2019-02-19 16:26:13 · 87 阅读 · 0 评论 -
乐观锁和悲观锁
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所有每次拿数据时都会上锁,这样别人想要拿这个数据时就会阻塞。如Java中的synchronized。适用于写操作较多的场景。乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所有不会上锁,但在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用CAS算法实现。适用于读操作较多的场景。 乐观锁实...原创 2019-02-18 18:50:02 · 62 阅读 · 0 评论 -
Java线程池
线程池的好处:降低资源消耗。通过重复利用已创建的额线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建聚能立即执行。 提高线程的可管理性。使用线程池可以对线程进行统一分配、调优和监控。线程池的创建new ThreadPoolExecutor(int corePoolSize, int maximu...原创 2019-02-17 16:10:26 · 89 阅读 · 0 评论 -
volatile
当一个变量定义为volatile后,他将具备两种特性 1,保证此变量对所有线程的可见性 这里的可见性是指:当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。 volatile可见性实现原理:Lock前缀指令会引起处理器缓存回写到内存 一个处理器的缓存回写到内存导致其他处理器的缓存无效 由于volatile变量只能保证可见性,在不符合一下两条规则...原创 2019-02-16 16:11:59 · 117 阅读 · 0 评论 -
Java创建线程的3中方法
继承Thread类创建线程类 通过Runnable接口创建线程类 通过Callable和Future创建线程一,继承Thread类创建线程类定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 创建Thread类的实例,即创建了线程对象。 调用线程对象的start()方法来启动该线程。public cla...转载 2019-03-08 22:05:38 · 173 阅读 · 0 评论 -
synchronized与ReentrantLock的区别
共同点:协调多线程对共享对象、变量的访问 都是可重入的,同一线程可以多次获得同一个锁 都保证了可见性和互斥性不同点:ReentrantLock是API级别,synchronized是JVM级别的 ReentrantLock可以实现公平锁 一个ReentrantLock对象可以绑定多个Connection对象 ReentrantLock有等待可中断特性--当持有锁的线程长期...原创 2019-03-14 10:36:08 · 116 阅读 · 0 评论 -
Thread类
yield() 告诉线程调度器自己愿意让出线程的使用(CPU资源),这方法几乎用不到 The sceduler is free to ignore this hintsleep(long mills) 暂时停止执行,但不会释放锁 The Thread does not lose ownership of any monitorst...原创 2019-03-19 19:12:37 · 88 阅读 · 0 评论 -
如何停止一个线程
停止一个线程的最佳方法是让它执行完毕,没有办法立即停止一个线程,但你可以控制何时或什么条件下让他执行完毕。通过条件变量控制线程的执行,线程内部检查变量状态,外部改变变量值可控制停止执行。为保证线程间的即时通信,需要使用volatile关键字或锁,确保读线程与写线程变量状态的一致性。pubic class BestPractice extends Thread { private ...转载 2019-03-19 19:43:26 · 189 阅读 · 0 评论 -
如何判断当前线程是否持有锁
Thread 类里有一个holdsLock(obj)方法 assert Thread.holdsLock(obj);/** * Returns <tt>true</tt> if and only if the current thread holds the * monitor lock on the specified object. ...原创 2019-03-01 13:49:20 · 3848 阅读 · 0 评论