美文网首页
多线程-释放锁带来的危险

多线程-释放锁带来的危险

作者: 祝方泽 | 来源:发表于2018-12-07 17:19 被阅读0次
type KV struct {
    mu Mutex
    data map[string]string
}

func (kv *KV) SendData() {
    for {
        sleep(1s)
        for _, host := hostList {
            go SendDataToRemote() {
                kv.mu.lock()
                // send kv.data['x'] to remote
                kv.mu.unlock()
            }
        }
    }
}

func (kv *KV) DeleteAnElem(k string) {
    kv.mu.lock()
    // delete data[k]
    kv.mu.unlock()
}

func main() {
    kv := make(KV)
    go kv.SendData()
    go kv.DeleteAnElem("x")
}

我想到有三种方案保护kv.data["x"]:

  1. Stop The World方式,每次网络传输时,禁止DeleteAnElem()执行,等所有网络传输结束后,再允许执行DeleteAnElem()。这种方式效率低。
  2. 在网络传输前,将要传输数据打包成参数,传给SendDataToRemote(),然后SendDataToRemote()与DeleteAnElem()互相独立,可以完全并行执行。
  3. SendDataToRemote()与DeleteAnElem()依然争抢kv.data,每次SendDataToRemote()获取锁时,先检查kv.data["x"]是否存在。总结一句话:获得锁之后,首先检查全局变量的状态,以防被其它线程修改

相关文章

  • 多线程-释放锁带来的危险

    我想到有三种方案保护kv.data["x"]: Stop The World方式,每次网络传输时,禁止Delete...

  • Synchronized的原理分析

    Java多线程运行环境中,在哪些情况下会使对象锁释放?释放锁: 不释放锁的情况: interrupted()和is...

  • 【python】多线程(高级篇)

    多线程互斥锁 关于如何使用Lock( 锁 ) 【目标】学习如何加锁,获取钥匙,释放锁. 语句如下: 【注释】loc...

  • 多线程之_释放锁

    以下操作将会释放锁 1、当前线程的同步方法、同步代码块执行完毕2、当前线程在同步代码块、同步方法中遇到break、...

  • day24

    1:多线程(理解) (1)JDK5以后的针对线程的锁定操作和释放操作 Lock锁:void lock(): 获取锁...

  • java 内存模型 锁的理解

    java 内存模型 锁的理解 Java 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”...

  • 对于多线程的锁的异常处理

    对于多线程的锁来说,如果某个线程获取了这个锁,但该线程挂掉了,然后锁就不会释放了。对于这种问题,只需要在锁初始化的...

  • Java多线程(十五)---锁的内存语义

    移步java多线程系列文章锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向...

  • synchronized几个小面试点

    synchronized的锁升降级 Java SE1.6为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和...

  • Java 锁

    1:锁存在的问题1)在多线程竞争锁的情况下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。而且在上...

网友评论

      本文标题:多线程-释放锁带来的危险

      本文链接:https://www.haomeiwen.com/subject/gzfxhqtx.html