多线程示例
主要用代码实现Java多线程、高并发
小白代码很容易理解
希尤
某北方不知名985袋鼠一枚
展开
-
java乐观锁和悲观锁最底层的实现
1. CAS实现的乐观锁CAS(Compare And Swap 比较并且替换)是乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的,也可以理解为自旋锁JUC是指import java.util.concurrent下面的包,比如:import java.util.concurrent.atomic.AtomicInteger;最终实现是汇编指令:lock...原创 2020-03-07 22:39:08 · 1160 阅读 · 0 评论 -
用synchronized或者读写锁ReadWriteLock实现缓存机制《十一》
用锁降级或者synchronized实现一个缓存参考了很多网上的代码,发现大部分都是一模一样的,而且是错的,根本没有实现缓存自己找了很久,发现了他们分别对应的问题A和B// syn实现缓存里面最关键的步骤 synchronized (map) { value = map.get(key);// A 这一行不能少 if (v...原创 2019-01-25 17:54:00 · 216 阅读 · 0 评论 -
多线程之读写锁ReadWriteLock的深度理解及用读写锁实现缓存《十》
读写锁1. 为什么要引入读写锁?1. 重入锁是一个时刻只能一个线程访问,读写锁同一个时刻允许多个线程访问2. 但是在写线程访问时,所有的读线程和其他写线程均被阻塞3. 读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁, 通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升 2. 读写锁特有的方法1. readLock() 获取读锁2. writeLock()...原创 2019-01-25 17:46:10 · 334 阅读 · 0 评论 -
多线程之重入锁锁ReentrantLock的深度理解《九》
1. 重入锁ReentrantLock顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择这里提到一个锁获取的公平性问题,如果在绝对时间上,先对锁进行获取的请求一定先被满足,那么这个锁是公平的,反之,是不公平的。公平的获取锁,也就是等待时间最长的线程最优先获取锁,也可以说锁获取是顺序的。事实上,公平的锁机制往往...原创 2019-01-25 17:44:34 · 282 阅读 · 0 评论 -
单例模式线程安全吗《十二》
单例模式线程安全吗?单例模式作为一种常见的设计模式,在程序中非常常见,主要是为了保证一个类只有一个唯一的对象。从简单的“饿汉式”、“懒汉式”→利用 synchronized 和 复杂的“双重校验DCL模式”,是一个考虑线程安全的过程那么单例模式线程安全吗1. 静态的饿汉式单例模式是线程安全的那非静态的饿汉单例模式呢?答案是:没有非静态的饿汉单例模式 public class Eh...原创 2019-01-30 12:07:46 · 1375 阅读 · 0 评论 -
为什么要用CountDownLatch?《十三》
CountDownLatch并发类的用法CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。比如下面的代码是让额外的线程和循环里面的线程都执行完毕后才最后打印System.out.println("10个线程已执...原创 2019-02-12 17:32:12 · 750 阅读 · 0 评论 -
什么是Java虚假唤醒及如何避免虚假唤醒?《多线程学习之十四》
那什么是假唤醒?当一个条件满足时,很多线程都被唤醒了,但是只有其中部分是有用的唤醒,其它的唤醒都是无用功1.比如说买货,如果商品本来没有货物,突然进了一件商品,这是所有的线程都被唤醒了 ,但是只能一个人买,所以其他人都是假唤醒,获取不到对象的锁避免虚假唤醒下面是避免虚假唤醒的示例:package duoxiancheng.bao;/* * 虚假唤醒的解决: * wait要始...原创 2019-02-12 17:35:02 · 15962 阅读 · 16 评论 -
Java 手写一个死锁
其实死锁很好理解,比如一个人要进入两个房间,但是这两个房间都是每次只能进入一个人,而且还是只能等里面的人办完事之后才能有另一个人进入转化为多线程就是:1.给这两个房间加一个class锁2. 让一个人张三在房间A的时候尝试获取房间B的锁3. 让李四在房间B的时候,尝试获取A的锁4. 这样就会造成死锁 package duoxiancheng.thread;public class ...原创 2019-03-21 17:19:27 · 404 阅读 · 0 评论 -
四种方式实现2个线程交互打印从1到100的奇偶数《八》
1. 利用volatile状态标志实现(自己写的,哈哈)package duoxiancheng.print;public class PrintBai { /* 1. 任务:两个线程交替的打印从1到100里面的奇数和偶数 2. 但是你如果查看打印结果会发现,其实当第一个线程运行的时候 另一个线程也没有闲着,也会在else里面打...原创 2019-01-24 22:52:48 · 1136 阅读 · 1 评论 -
线程中断、线程通信、线程锁《二》
1. LOCK 锁它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。vod lock() 获取锁,调用当前方法后,当前线程将会获取锁,获取锁...原创 2019-01-24 21:48:41 · 228 阅读 · 0 评论 -
线程的创建、线程执行顺序、循环创建线程《一》
1. 线程创建//1. 重写run()方法创建一个线程Thread thread1 = new Thread(new Runnable() { @Override public void run() { System.out.println("开始执行线程"); int a = 0...原创 2019-01-24 21:28:34 · 764 阅读 · 0 评论