
多线程与并发
努力不停努力
我要成为自己眼中最耀眼的一束光
展开
-
Leetcode1117. H2O 生成 (多线程编程)
原题链接H2O生成Semaphore 信号量Semaphore 信号量 + CyclicBarrier 同步屏障Semaphore 信号量每生成两个氢原子,再去生成一个氧原子class H2O { private Semaphore s; private Semaphore o; public H2O() { s = new Semaphore(0); o = new Semaphore(2); } public void原创 2021-06-28 15:09:09 · 296 阅读 · 0 评论 -
可重入锁和不可重入锁
可重入锁,线程可以再次进入它已经获得的锁,在同一线程内的如下操作并不会造成死锁。但是,加多少次锁就得释放多少次。lock.Lock();lock.Lock(); // 这一步可重入锁允许,不可重入锁不允许。lock.unLock();lock.unLock();不可重入锁,线程无法再次进入它已经获得的所,在同一线程的如上操作会造成死锁。...原创 2021-03-06 13:45:31 · 212 阅读 · 0 评论 -
线程创建,并发,信号量,可重入锁 加例题(Leetcode1116)详解
例题:Leetcode1116. Print Zero Even Odd 无锁并发信号量可重入锁(ReentrantLock)和条件变量(Condition)例题三个条件变量的解法例题一个条件变量的解法(使用signalAll())线程创建无锁并发class ZeroEvenOdd { private int n; // volatile变量用来控制各个方法的输出顺序 private volatile int state; public ZeroEvenOdd(int原创 2021-03-05 18:11:56 · 300 阅读 · 0 评论 -
Java并发相关知识
原文链接守护线程是程序运行时在后台提供服务的线程(级别较低),不属于 程序中不可或缺的部分。当所有非守护线程结束时,程序也就终止,不管守护线程有没有结束,程序都会终止,同时会杀死所有守护线程。main() 属于非守护线程。在线程 启动之前 使用 setDaemon() 方法可以将一个线程设置为守护线程。public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thre原创 2021-03-04 18:13:34 · 195 阅读 · 1 评论 -
CAS(Compare_And_Swap 或者 Compare_And_Set)
CAS 指令需要有 3 个操作数,分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时,只有当 V 的值等于 A,才将 V 的值更新为 B。CAS操作需要硬件级别的支持,要求 compare 和 swap或set是原子操作。...原创 2021-03-04 16:45:23 · 452 阅读 · 1 评论 -
volatile关键字
一个volatile变量,它将具备两项特性:保证此变量对所有线程的可见性。当一个线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。由于Java里面的运算操作符并非原子操作,导致volatile变量的运算在并发下一样是不安全的。禁止指令重排序优化,普通的变量仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。具体见《深入理解Java虚拟机第三版》第12章...原创 2021-03-03 14:31:52 · 92 阅读 · 2 评论 -
使用信号量实现生产者-消费者问题
#define N 100//信号量typedef int semaphore;//对缓冲区的锁,一个二进制的信号量semaphore mutex = 1;//empty是计数信号量,N是缓冲区空闲位置的数目,//empty不为0时,生产者才能往缓冲区添加物品semaphore empty = N;//full是计数信号量,只有当full不为0时,消费者才能拿走物品semaphore full = 0;/** * 不能先down(&mutex)再down(&empty原创 2021-02-24 16:48:59 · 601 阅读 · 0 评论 -
信号量
一个信号量(semaphore) S 是个整型变量,它除了初始化外只能通过两个标准原子操作:wait() 和 signal() 来访问。操作wait() 最初称为P, signal() 最初称为 V。wait()会-1, signal()+1。wait():wait(S) { while(S <= 0); //busy wait s--;}signal():signal(S) { S++;}计数信号量值不受限制,可以用于控制拥有多个实例的某种资源,初始值为可用资源数原创 2021-02-24 15:57:09 · 319 阅读 · 1 评论 -
读者写者问题
CS-NOTES原创 2021-02-25 23:15:31 · 73 阅读 · 0 评论 -
哲学家就餐问题
设有5个哲学家。哲学家就餐问题的解决需要用到条件变量和互斥锁,另外,哲学家应该有3个状态:hungry,thinking,eating。声明哲学家变量如下:线程的创建不再赘述。哲学家线程如下:这是5个哲学家线程共同调用的线程函数,其中p_n是哲学家的id(索引)。哲学家通过pickup_forks()函数试图同时拿起位于他左右边的餐具,进入eating状态。通过sleep()函数模拟就餐和思考的过程。pickup_forks()函数具体如下:其中,test()函数是哲学家在原创 2021-02-25 23:16:05 · 309 阅读 · 0 评论