并发编程
并发编程基础
裸奔的小强QQ
每天进步一点点
展开
-
轻松理解CAS算法
CAS算法CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有一个线程能更新变量的值,其它线程都会更新失败,但是更新失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,如果修改失败(即当前内存值与旧的预期值不一致), 则将预期值更新为最新的内存值,...原创 2020-05-07 00:20:34 · 574 阅读 · 0 评论 -
轻松理解java中的volatile关键字
volatile是什么?volatile是java中的一个关键字; 它可以用来修饰成员变量;被它修饰的变量可以保证可见性.什么是可见性?可见性是指多个线程访问同一个共享变量时, 如果某个线程对共享变量进行了修改, 那么其他线程读取到的必须是修改后的值.这就是可见性.先来看看常见的可见性问题:class Game extends Thread { public int index ...原创 2020-05-07 00:10:43 · 120 阅读 · 0 评论 -
轻松理解ThreadLocal的原理及应用场景
ThreadLocal是什么?ThreadLocal会给每个线程提供一个变量副本, 把共享变量的数据都拷贝到自己的变量副本中, 每个线程都只操作自己变量副本中的变量, 不会操作到主内存中的共享变量. 这样可以防止在并发的情况下,因其他线程对共享变量的修改而对当前线程造成影响.ThreadLocal的应用场景在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchro...原创 2020-05-06 23:55:13 · 402 阅读 · 0 评论 -
多线程: 如何实现多个线程交替打印字符串?
编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:如果这个数字可以被 3 整除,输出 “fizz”。如果这个数字可以被 5 整除,输出 “buzz”。如果这个数字可以同时被 3 和 5 整除,输出 “fizzbuzz”。例如,当 n = 15,输出: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14,...原创 2020-05-05 23:21:59 · 869 阅读 · 0 评论 -
多线程: 如何实现多个线程按序打印?
题目提供一个类public class Foo { private static void printA() { System.out.print("A"); } private static void printB() { System.out.print("B"); } private ...原创 2020-05-05 19:23:37 · 618 阅读 · 0 评论 -
轻松理解java读写锁ReentrantReadWriteLock的底层原理
锁降级的必要性:锁降级中读锁的获取是否必要呢?答案是必要的。首先, 主要是为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁, 写锁释放之后可能会被其他的线程获取到.假设此刻另一个线程(记作线程T)获取了写锁并修改了数据,那么当前线程是无法感知线程T的数据更新的。如果当前线程获取读锁,即遵循锁降级的步骤,则线程T将会被阻塞,直到当前线程使用数据并释放读锁之后,线程T才能获取写锁进...原创 2020-04-24 00:58:12 · 612 阅读 · 0 评论 -
浅谈ReentrantLock
ReentrantLock构造方法: //默认使用的是非公平的锁 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairS...原创 2020-04-19 03:00:30 · 244 阅读 · 0 评论 -
浅谈锁的升级过程
锁锁升级的过程:无锁>>偏向锁>>轻量级锁>>重量级锁偏向锁:减少同一线程获取锁的代价;因为在大多数情况下,一把锁很多时候都是由同一个线程重复获取。在没有多线程竞争的情况下,如果同一线程每次都会去请求锁,势必会造成没必要的资源浪费。因此,为了减少同一线程获取锁的代价,引入了偏向锁的概念。偏向锁会偏向于第一个获取到该锁的线程。当第一个线程获取到一把锁时...原创 2020-04-19 02:44:15 · 654 阅读 · 0 评论 -
轻松理解ConcurrentHashMap的原理
ConcurrentHashMap是一种线程安全的hashmap,相对于HashTable, 它拥有更高的并发性.现在,我们就来分析一下在JDK1.8下的ConcurrentHashMap的实现及原理:get()方法 public V get(Object key) { Node<K,V>[] tab; Node<K,V> e, p; int n...原创 2020-04-19 02:33:06 · 152 阅读 · 0 评论 -
如何实现某个线程在其他线程执行完毕之后再执行?
我们都知道, 在使用多线程编程的时候,每个线程运行的顺序都是随机的, 它由CPU的线程调度机制决定执行哪个线程;我们可以看看正常使用多线程编程时程序的运行顺序:import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.C...原创 2020-04-19 01:41:51 · 5345 阅读 · 0 评论