线程同步--协同方式和互斥方式

参考博客:http://www.cnblogs.com/kennyMc/archive/2012/12/15/2818887.html   互斥量进行线程同步,与关键段和事件的区别

参考博客:http://www.cnblogs.com/xilentz/archive/2012/11/13/2767317.html       四种进程或线程同步互斥的控制方法

线程同步解决多线程并发问题;


几种内核对象中,除了互斥量,没有任何一个会记住自己是哪个线程等待成功的。

互斥量和关键段的比较:

(1)关键段只适用于同一个进程,互斥量可适用与不同的进程

(2)关键段的效率更高

(3)关键段不安全,而互斥量更安全;

 四种进程或线程同步互斥的控制方法

1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 
3、信号量:为控制一个具有有限数量用户资源而设计。 
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

/************** 线程同步--互斥方式******************/

1、原子访问---变量为Volatile关键字修饰,避免编译器优化,始终从变量在内存中的位置读取变量的值。

原子访问:指线程在访问某一个资源的同时保证没有其他线程会在同一时刻访问同一资源。

即:需要保证递增或者递减操作是原子操作(不可被中断的一个或一系列操作),不会被打断.

    处理器自动保证基本的内存操作的原子性---当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。复杂的内存操作处理器不能自动保证其原子性,处理器提供总线锁定缓存锁定两个机制保证内存操作的原子性.

X86系列CPU,Interlocked 函数会在总线上维持一个硬件信号LOCK#,这个信号会组织其他CPU访问同一个内存地址; 所谓“缓存锁定”就是如果缓存在处理器缓存行中内存区域在LOCK操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效,

Interlocked 函数执行得极快,不需要在用户模式和内核模式之间进行切换,

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程同步互斥是确保多个线程正确协同工作的关键。在Java中,可以通过使用`synchronized`关键字来实现线程同步互斥。下面是一个简单的示例代码: ```java class Counter { private int count = 0; public synchronized void increment() { count++; } public synchronized int getCount() { return count; } } class MyThread extends Thread { private Counter counter; public MyThread(Counter counter) { this.counter = counter; } public void run() { for (int i = 0; i < 1000; i++) { counter.increment(); } } } public class Main { public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); MyThread thread1 = new MyThread(counter); MyThread thread2 = new MyThread(counter); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println(counter.getCount()); } } ``` 在这个示例代码中,`Counter`类是一个计数器,包含两个同步方法:`increment()`和`getCount()`。`increment()`方法递增计数器的值,`getCount()`方法返回计数器的当前值。`MyThread`类是一个线程,它接收一个`Counter`对象并在其`run()`方法中重复调用`increment()`方法。在`main()`方法中,创建两个`MyThread`对象并启动它们。使用`join()`方法等待这两个线程完成,然后输出计数器的值。 使用`synchronized`关键字确保`increment()`和`getCount()`方法在同一时刻只能被一个线程访问。这样可以确保计数器的值在多个线程之间同步,并避免竞态条件的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值