java并发程序

java内存模型

规范了jvm如何按需提供禁用缓存和编译优化的方法

具体操作:按需禁用缓存,禁用编译优化。 关键字: volatile(禁用cpu缓存) synchronized final

Happens-Before表达的是:前面一个操作的结果对后续操作是可见的

管程  是一种通用的同步原语,在 Java 中指的就是 synchronized,synchronized 是 Java 里对管程的实现

具体包含6条规则:

1、程序的顺序性规则

2. volatile 变量规则

3. 传递性

4. 管程中锁的规则   这条规则是指对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。

5. 线程 start() 规则   它是指主线程 A 启动子线程 B 后,子线程 B 能够看到主线程在启动子线程 B 前的操作。

6. 线程 join() 规则   它是指主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程 B 的 join() 方法实现),当子线程 B 完成后(主线程 A 中 join() 方法返回),主线程能够看到子线程的操作。当然所谓的“看到”,指的是对共享变量的操作

final 修饰变量时,初衷是告诉编译器:这个变量生而不变,可以可劲儿优化

可见性     缓存导致可见性问题

有序性     编译优化导致有序性问题

原子性     cpu指令执行不被中断,叫做原子性。问题源头在于线程切换

“同一时刻只有一个线程执行”这个条件非常重要,我们称之为互斥

需要互斥执行的代码称为临界区

Java 语言提供的锁技术:synchronized   (锁的一种实现)


class X {
  // 修饰非静态方法
  synchronized void foo() {
    // 临界区
  }
  // 修饰静态方法
  synchronized static void bar() {
    // 临界区
  }
  // 修饰代码块
  Object obj = new Object();
  void baz() {
    synchronized(obj) {
      // 临界区
    }
  }
}  


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值