当前位置: 首页 > 面试题库 >

如果我正确使用通道,是否需要使用互斥锁?

公良扬
2023-03-14
问题内容

如果我正确使用通道,是否需要使用互斥锁来防止并发访问?


问题答案:

如果正确使用通道,则不需要互斥。在某些情况下,使用互斥锁的解决方案可能会更简单。

只需确保包含通道值的变量已正确初始化,然后使用多个goroutine尝试访问通道变量即可。一旦完成,按设计访问通道(例如,向它们发送值或从中接收值)是安全的。

带有参考文献的证明文件(重点由我添加):

规格:渠道类型:

单个信道 ,可以使用
在发送的语句,接收操作,并调用内置的功能cap
通过任何数量的够程无需进一步同步
。通道充当先进先出队列。例如,如果一个goroutine在通道上发送值,而第二个goroutine接收到它们,则按发送顺序接收值。len


有效执行:并发:通过交流共享

实现对共享变量的正确访问所需的微妙之处使得在许多环境中进行并行编程变得很困难。Go鼓励采用一种不同的方法,在这种方法中,共享值在通道中传递,实际上,决不由单独的执行线程主动共享。
在任何给定时间,只有一个goroutine可以访问该值。 根据设计,不会发生数据争用。为了鼓励这种思维方式,我们将其简化为一个口号:

不要通过共享内存进行通信; 而是通过通信共享内存。

这种方法可能太过分了。例如,最好通过将互斥锁放在整数变量周围来完成引用计数。但是,作为一种高级方法,使用通道来控制访问权限使编写清晰,正确的程序变得更加容易。

本文也非常有帮助:Go Memory Model

还引用了的打包文档sync

包同步提供基本的同步原语,例如互斥锁。除一次和等待组类型外, 大多数都供低级库例程使用。 更高级别的同步最好通过渠道和通信来完成。



 类似资料:
  • 问题内容: 我从python中的多线程开始(或者至少我的脚本有可能创建多个线程)。该算法是否是Mutex的正确用法?我尚未测试此代码,它可能甚至无法正常工作。我只希望processData在一个线程中运行(一次一个),而主while循环保持运行,即使队列中有一个线程也是如此。 编辑:重新阅读我的代码,我可以看到它是完全错误的。但是,这就是为什么我在这里寻求帮助。 问题答案: 我不知道您为什么要使用

  • 问题内容: 通道将通信(值的交换)与同步相结合,以确保两个计算(goroutines)处于已知状态。 如何使用Google Go中的频道执行互斥功能? 问题答案: 将通道用作互斥对象的示例: 您也可以使用而不是减小内存大小。输入的值是(type 和一个空的content )。有关示例,请参见Ivan black的评论 。

  • 问题内容: 我想知道我是否在通话。 如果我正在通话,请启动服务(服务部分已清除)。我该怎么做呢? 参加通话时,我需要致电服务中心…我不知道该怎么做?有什么帮助吗? 问题答案: 您需要广播接收器… 在清单中声明广播接收器… 还声明使用权限… 广播接收器类… 还有一类可自定义电话状态侦听器…

  • 问题内容: 我想在Java中使用池化连接(因为每个线程创建一个连接非常昂贵),所以我正在使用该对象。我正在跨线程保留我的数据源。因此,我在整个应用程序中仅使用一个数据源,如下所示: 现在,我已经创建了数据源,然后在每个单独的线程中执行以下操作: 我猜我很困惑, 这真的 是在 获取池连接吗? 这个线程安全吗?我注意到PooledConnection具有诸如notify()和wait()之类的方法…这

  • 我使用testAd ID(ca-app-pub-3940256099942544/1033173712)从admob不是我的admob ID,我需要使用addTestDevice()太,而在移动设备测试?它甚至显示了测试广告屏幕,而不是实时广告。 因为我这样做了,我整天都在使用我的应用程序进行测试,晚上我收到了账户暂停邮件。

  • 如果我的代码中有一个try/cat块,是否需要在方法头后面有一个throws语句? 如果不是必需的,那么我什么时候/为什么需要使用throws?-这只是为了阻止编译器失败吗?(也就是说,我告诉它,我期待着一个错误,这没关系)