乱写线程的并发

1.线程,进程

1.有一个好问题,什么是进程,什么是线程

  1. 进程:把一个程序放到内存里面去执行就形成了一个进程,所以说一个程序可以对应多个进程,因为可以多开嘛,一个进程放到内存中,他的大小是被设置好的,有一些功能已经被打开了,但是这时候他还没有运行,为什么呢?因为cpu还没有拿到他的主线程,等拿到他的主线程,他才会被执行,可以理解为分配资源的基本代为,是一个静态的东西,线程是一个动态的基本单位,是cpu调度的基本单位,cpu在某个时间点只能执行一个指令,这个指令是属于某个线程的
  2. 线程:

内存和cpu之间的速度是1:100,内存和cpu之间有三级缓存,L1,L2,L3

从内存中专门读出来一块值放到我的缓存中来的时候,这一块叫做缓存行,cache line,这一行是64字节
缓存行被拿到之后会缓存到不同的cpu当中

volitale,只是一个标准
1.内存可见性
2.防止代码执行乱序,增加内存屏障保证读写顺序(内存屏障是特殊指令:看到这种指令,前面的必须执行完,后面的才能执行)

hotspot实现:

  1. 由以下代码可知volitale的实现是lock; addl,lock是一条锁总线的指令
  2. 内存可见性:LOCK 用于在多处理器中执行指令时对共享内存的独占使用,它的作用是能够将当前处理器对应缓存的内容刷新到内存,并使其他处理器对应的缓存失效。
  3. 防止指令重排:另外还提供了有序的指令无法越过这个内存屏障的作用。
  4. addl $0:这个操作表示向cpu中的esp寄存器中增加一个0的操作,就是啥也没加,空操作,中心思想是要lock
int field_offset = cache->f2_as_index(); 
if (cache->is_volatile()) { 
	if (support_IRIW_for_not_multiple_copy_atomic_cpu) { 
		OrderAccess::fence(); 
}

inline void OrderAccess::fence() {
   if (os::is_MP()) {
     // always use locked addl since mfence is sometimes expensive
 #ifdef AMD64
     __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory");
 #else
     __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");
 #endif
   }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值