5 多线程,原子操作

推荐高洪岩的《Java多线程编程核心技术》,虽然很多代码都是纯粹为了炫耀技术,但看完之后再也不怕被多线程问倒了

随笔提一句,前面看了那多章同步代码块的内容,后面却发现lock完全可以取代。这本书在我看来可以砍掉一半,直接用Lock就好了。

问题1:用Java写代码来解决生产者——消费者问题

使用lock实现,另外MQ消息队列的点对点模式也是同样的原理,以及duboo的发布订阅模式。

MY:关键是搞明白何时阻塞、唤醒相关线程;wait/nofityAll

 1
 2 hasv=false;
 3
 4
 5 set()
 6 {
 7  lock.lock()
 8 while(hasv==true)
 9 {
10   condition.await();
11 }
12 hasv=true;
13 condition.signal();
14 }
15 finally lock.unlock();
16 }
17
18 get()
19 {
20   和set类似相反
21 }

run.java:

10个AB线程一起启动,A使用set,B使用get。就会交替执行A和B。使hasv的值改变,可打印信息查看
i=0,i<10,i++
threadA[i].start()
threadB[i].start()

问题2:原子操作

double、long是 64位的,32位系统会赋值两次(即两个原子操作),在多线程环境下,可能刚读高32位,低32位被其他写覆盖了。

因此使用volatile关键字,确保在并发环境中确保可见性、顺序性和一致性。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

volatile是程度较轻的 synchronized,这个关键字非常不好控制,干脆不用为好。

使用场景:可以用在Long个double变量上,见上面原子操作

问题3:多线程实战

A 在顶置的偏光片切割利用到,主要矛盾是CPU运算耗时长,打开任务管理发现双核CPU总是占用50%,另一核心根本没使用。

于是改成多线程计算,计算次数是可预见的,直接粗暴的按照CPU核心数来创建线程数量。然后等待所有线程运算完毕,结果集合并。

B 手动实现消费者-生产者模式

时间: 2024-10-20 16:44:43

5 多线程,原子操作的相关文章

[OS] 多线程--原子操作 Interlocked系列函数

转自:http://blog.csdn.net/morewindows/article/details/7429155 上一篇<多线程--第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错.这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将一个表示计数的变量递增.程序在最后输出计数的值表示有今天多少个用户登录,如果这个值不等

多线程原子操作

转载地址:http://www.cnblogs.com/FrankTan/archive/2010/12/11/1903377.html gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作. 其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...)type __sync_fetch_and_sub (type *ptr, type value, ...)type __sync_fe

C++拾遗--多线程:原子操作解决线程冲突

C++拾遗--多线程:原子操作解决线程冲突 前言 在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作. 正文 1.线程冲突 #include <stdio.h> #include <stdlib.h> #include <process.h> #include <Windows.h> int g_count = 0; void count(void *p) { Sleep(100); //do some work //每个线程把g_c

多线程编程之原子操作

在多线程环境中,对共享的变量的访问,可以使用基于Compare And Swap这种lock free的技术进行实现,这种实现的好处是效率高. 一.原子操作摘录 1.1 Android 源码:system/core/libcutils /atomic.c(针对X86): 1 #elif defined(__i386__) || defined(__x86_64__) 2 3 void android_atomic_write(int32_t value, volatile int32_t* ad

秒杀多线程第三篇 原子操作 Interlocked系列函数

版权声明:本文为博主原创文章,未经博主允许不得转载. 上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错.这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将一个表示计数的变量递增.程序在最后输出计数的值表示有今天多少个用户登录,如果这个值不等于我们启动的线程个数,那显然说明这个程序是有问题的.整个程序代码如下:

多线程笔记--原子操作Interlocked系列函数

前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果.这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增.程序在最后输出这个计数的值表示今天有多少用户登录.如果这个值不等于我们启动的线程个数,那这个程序就是有问题的. #include <stdio.h> #include <process.h> #include <Windows.h> volatile long g_nLogin

多线程计数器——原子操作

众所周知,多线程下计数存在着计数不正确的问题.这个问题的根源在于多个线程对同一个变量可以同时访问(修改).这样就造成了修改后的结果不一致. 首先在这里先强调一点,volatile 关键字并不能提供多线程安全访问.因为有volatie修饰的变量,每次操作时遵循下面动作: 从内存取值 ---> 放入寄存器 ---> 操作 --->写回内存 这几个步骤不是原子的操作在任意两个步骤之间都可能被其他的线程中断,所以不是线程安全.详细内容参见 http://blog.csdn.net/littlef

[原] 锁&amp;锁与指令原子操作的关系 &amp; 如何成就最快的多线程Queue?

锁 锁以及信号量对大部分人来说都是非常熟悉的,特别是常用的mutex.锁有很多种,互斥锁,自旋锁,读写锁,顺序锁,等等,这里就只介绍常见到的, 互斥锁 这个是最常用的,win32:CreateMutex-WaitForSingleObject-ReleaseMutex,linux的pthread_mutex_lock-pthread_mutex_unlock,c#的lock和Monitor,java的lock,这些都是互斥锁.互斥锁的作用大家都知道,是让一段代码同时只能有一个线程运行, 自旋锁

[转] 多线程下变量-gcc原子操作 __sync_fetch_and_add等

http://blog.sina.com.cn/s/blog_6f5b220601013zw3.html 非常好的原子操作,不用加锁:__sync_fetch_and_add GCC 提供的原子操作 gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作. 其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *ptr