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 はデッドロック コード ロック L1 を解決して スレッドのロック適用操作がブロックされたため、スレッドT_AとスレッドT_Bは所望のロックを正しく取得できず、2つのスレッドはブロックされてデッドロック状態に陥ります。Java スレッド同期ロック ReentrantLock および条件割り込み待機プログラムの前提条件は、met_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メイン { プライベート キュー... https://blog.csdn.net/zhangphil/article/details/92814997

新しい Java スレッド セマフォ: 並列環境での競合リソース制御へのアクセス_zhangphil のブログ - CSDN ブログ新しい Java スレッド セマフォ: 並列環境での競合リソース制御へのアクセス セマフォは、Java 1.5 から導入された新しい Java スレッドです。セマフォは、スレッドの競合リソース アクセス環境下でリソース アクセス制御を実装します。セマフォのライセンスを取得したスレッド タスクのみが、競合するリソースにアクセスできます。例: private void test() { // 多くのスレッドが特定のリソースにアクセスしたいと考えていますが... https://blog.csdn.net/zhangphil/article/details/83410270

おすすめ

転載: blog.csdn.net/zhangphil/article/details/132086155