![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程
qq_41911762
为每行代码增添注释
展开
-
线程间通信之生产者消费者模型(notify()、notifyAll()的区别、多个生产者消费者比较分析)
锁池(entrySet): 假设线程A已经拥有对象锁,线程B、C想要获取锁就会被阻塞(blocked),进入一个地方去等待锁的等待,这个地方就是该对象的锁池;等待池(waitSet): 假设线程A调用某个对象的wait方法,线程A就会释放该对象锁,同时线程A进入该对象的等待池中,状态为waiting,进入等待池中的线程不会去竞争该对象的锁。另外线程调用对象notify(...原创 2019-11-03 18:00:49 · 266 阅读 · 1 评论 -
线程间通信之管道流(PipedInputStream、PipedOutputStream)
下面是用文件输入输出流配合管道输入输出流完成文件复制的功能。发送方:文件输入流读数据到管道输出流。接收方:管道输入流读数据到文件输出流。package pipedCommunication;import java.io.*;public class Demo { //发送线程 static class Sender implements Runnable {...原创 2019-11-03 22:06:18 · 457 阅读 · 0 评论 -
StampLock使用(乐观读,锁升级)
package stamplock;import java.util.concurrent.locks.StampedLock;/** * 所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为0表示获取失败,其余都表示成功; * 所有释放锁的方法,都需要一个邮戳(Stamp),这个Stamp必须是和成功获取锁时得到的Stamp一致; * StampedLock是不可重入的;...原创 2019-11-03 14:01:54 · 1284 阅读 · 0 评论 -
关于锁降级(ReentrantReadWriteLock)
锁降级:线程获取写锁后,在释放写锁之前获取读锁,然后再释放写锁,这样就实现了锁降级的特性。注意:线程获取读锁后,写锁不会释放,需要显示的释放,在ReentrantReadWriteLock中,不存在锁的升级。锁降级应用场景: 对于数据比较敏感, 需要在对数据修改以后, 获取到修改后的值, 并进行接下来的其它操作。package xxx;import java.util.concu...原创 2019-11-01 17:11:42 · 264 阅读 · 0 评论 -
ReentrantLock公平锁与非公平锁的区别
1、在公平实现中,sync为FairSync,其lock()方法与NonfairSync相比,少了抢占的步骤:NonfairSync中的lock():final void lock() { if (compareAndSetState(0, 1))//抢占 setExclusiveOwnerThread(Thread.currentT...原创 2019-10-31 17:17:43 · 205 阅读 · 0 评论 -
实现Look接口,自定义锁简单实现(不可重入、可重入)
1、简单实现(不可重入)Lock的实现类:package mylock;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;public class MyLock implements Lo...原创 2019-10-30 15:25:39 · 534 阅读 · 0 评论 -
ReentrantLock之非公平锁的实现
Lock接口、ReentrantLock、Sync、FairSync、NonFairSync、AbstractQueuedSynchronizer(AQS)的关系:ReentrantLock实现了Lock接口;Sync是ReentrantLock中的一个内部抽象类、继承了AQS;FairSync和NonfairSync都是ReentrantLock中的内部类,都继承了Sync,并且实现了S...原创 2019-10-31 10:57:52 · 385 阅读 · 0 评论 -
用ReentrantLock、Condition实现三个线程的for循环交替打印
好记性不如烂笔头,在此记下Reentrant与Condition配合使用的一般方法。有三个线程tA、tB、tC,当i为1时线程tA打印,当i为2时线程B打印,当i为3时线程C打印,并且这三个线程遵循tA唤醒tB,tB唤醒tC,tC唤醒tA的规则。package reentrantLockUsage;import java.util.concurrent.locks.Condition...原创 2019-10-30 17:45:04 · 1305 阅读 · 0 评论 -
单例模式与线程安全(懒汉式、double check、volatile)
1.饿汉式单例饿汉式单例:在类加载的时候,就已经初始化,无论之后用没用到。这样写法简单,线程安全,但是占内存。值得注意的是构造方法必须私有。package Singleton;public class HungerSingleton { private static HungerSingleton singleton=new HungerSingleton(); p...原创 2019-10-29 20:30:00 · 444 阅读 · 1 评论 -
synchronize的几种用法
1.作用在普通方法上在这种情况下是对象锁,下面可以看到同一时刻只有一个线程能进入demo对象的increase()方法。要进入synchronized修饰的普通方法,就要获取当前对象(demo)的锁。这种方式仅适用于单例模式。Demo类:package sychronize_usage;public class Demo { volatile int count...原创 2019-10-29 18:19:03 · 2053 阅读 · 0 评论 -
线程的挂起和唤醒为什么不用suspend()和resume()
如果用suspend()方法将线程挂起,线程占有的资源不会被释放,很有可能让其他线程死锁。package Suspend;public class SuspendDemo implements Runnable { private static Object obj = new Object(); @Override public void run() {...原创 2019-10-29 16:42:19 · 347 阅读 · 0 评论 -
多线程debug
将断点设置为线程级别:原创 2019-09-07 21:40:14 · 97 阅读 · 0 评论 -
Java中自增操作的线程不安全性
首先上代码:开启10个线程,每个线程对i自增100次package demo1;public class demo1 { private static volatile int i=0; //volatile保证线程可见性 public static void iIncrease(){ i++; } public static void m...原创 2019-09-07 12:38:35 · 475 阅读 · 0 评论