ReentrantLock锁并发环境线程安全读写ArrayList,Kotlin
import kotlinx.coroutines.*
import java.util.concurrent.locks.ReentrantLock
import kotlin.collections.ArrayList
/**
* 假设这样一种场景:在多线程的并发环境中,不同的线程/协程对于一个线程不安全的列表读写,确保数据写入后,被读取出来是正确无误的。
*
*/
fun main() {
val lock = ReentrantLock()
var list = ArrayList<String>()
runBlocking {
CoroutineScope(Dispatchers.IO).launch {
while (true) {
delay((Math.random() * 10 + 100).toLong())
lock.lock()
println("R--->${list[list.size - 1]}") //这里很容易发生数组越界问题。
lock.unlock()
}
}
while (true) {
val l = ArrayList<String>()
for (i in 0..<(Math.random() * 10 + 10).toInt()) {
l.add("$i")
}
lock.lock()
list.clear()
list.addAll(l)
println("W-${list.size}")
lock.unlock()
delay((Math.random() * 10).toLong())
}
}
}
W-14
W-10
W-11
W-10
W-15
W-14
W-14
W-10
W-14
W-14
R--->13
W-11
W-15
W-14
W-10
W-12
W-11
W-12
R--->11
W-16
W-19
W-11
W-16
W-14
W-16
W-10
R--->9
W-12
W-17
W-11
W-16
W-10
W-19
W-16
W-16
W-14
W-12
R--->11
W-12
W-13
W-16
W-14
W-17
W-15
W-13
R--->12
ReentrantLock替换synchronized解决多线程并发死锁,Java_reentrantlock解决死锁问题的代码_zhangphil的博客-CSDN博客Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2,而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。线程的锁申请操作是阻塞的,于是造成线程T_A和线程T_B无法正确获得想要的锁,两个线程被阻塞进入死锁状态。Java线程同步锁ReentrantLock和Condition中断等待程序前提条件满足_zhangphil的博客-CSDN博客。_reentrantlock解决死锁问题的代码https://blog.csdn.net/zhangphil/article/details/127548507
Java线程同步可重入锁ReentrantLock与Condition_zhangphil的博客-CSDN博客import java.util.LinkedList;import java.util.Queue;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class Main { private Queue...https://blog.csdn.net/zhangphil/article/details/92814997
新Java线程Semaphore:并行环境下访问竞争资源控制_zhangphil的博客-CSDN博客新Java线程Semaphore:并行环境下访问竞争资源控制Semaphore是从Java 1.5引入的Java线程新内容。Semaphore实现在线程的竞争资源访问环境下,对资源的访问控制。只有申请(acquire)得到Semaphore的许可证的线程任务可以访问竞争资源。例如: private void test() { // 虽然有很多线程想访问某些资源,但...https://blog.csdn.net/zhangphil/article/details/83410270