线程同步

多个线程同时访问1个数据时,如果只有读操作没有写操作可以不同步,如果写和读同时交互,就需要加锁,对数据进行同步,如STL容器是线程安全的,可以不考虑,除了少部分情况下还是有问题的。

1.使用特殊域变量(volatile)实现线程同步

a.volatile关键字为域变量的访问提供了一种免锁机制,

b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,

c.因此每次使用该域就要重新计算,而不是使用寄存器中的值

d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量

2.同步锁代码块

临界区等,保护代码块的完整执行

3.信号开关同步(lock、unlock)

a.平行线程

同步,一先一后的执行代码wait+reset-->signal

死锁,各自等待

b.主从(父子)关系线程

父子线程,在多连接的服务器上,很普遍,同步机制也比较复杂,和一般的线程同步不同,父子线程中,由于要求高的连接数,需要父线程尽量少的阻塞。如下图,一个线程中生成另外两个线程,其中的写或读的关键点已标出,需要volatile变量标记,使主线程在整个循环中,只有变量标记为阻塞时阻塞。

结论:

基于代码块的读写加锁,是线程同步中最方便、和通用的做法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • QListWidget添加删除

    qt和vc一样自由线程模式,线程间可以访问ui,但线程间访问qt内部封装问题,导致很多一样,可以使用信号和槽线程间传递数据,避免异常

    sofu456
  • 后台线程和ui线程

    sofu456
  • wpf线程进度控制

    C#线程为单线程模式,所有界面资源线程之间不能共享,对于主线程中后台代码业务处理比较耗时的情况下,需要添加新的线程处理另外一些界面效果。

    sofu456
  • 线程安全(上)--彻底搞懂volatile关键字

    对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事。

    帅地
  • ThreadLocal原理探究

    多线程访问同一个共享变量特别容易出现并发问题,特别是多个线程需要对一个共享变量进行写入时候,为了保证线程安全,一般需要使用者在访问共享变量的时候进行适当的同步,...

    加多
  • 多线程编程必备技术—— volatile,synchronized,lock

    volatile: volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。确保本条指令不会...

    Java深度编程
  • 3分钟速读原著《Java并发编程的艺术》(一)

    cwl_java
  • Java同步问题面试知识学习

    Java同步问题面试知识学习 同步 在多线程程序中,同步修饰符用来控制对临界区代码的访问。其中一种方式是用synchronized关键字来保证代码的线程安...

    用户1289394
  • windows 常用thread方法

    1.HANDLE CreateThread( _In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_S...

    战神伽罗
  • Java concurrency in practice笔记 02 03

    线程安全性的核心是正确性,正确性的含义是如果类的行为与其规范完全一致。因此当多个线程访问某个类时,类的行为始终是安全的,这个类就是线程安全的,...

    Dylan Liu

扫码关注云+社区

领取腾讯云代金券