ReentrantLock锁并发环境线程安全读写ArrayList,Kotlin

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

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/132086155
今日推荐