zoukankan      html  css  js  c++  java
  • Java高并发程序设计(二)--JMM和volatile和synchronized

    首先介绍JMM(Java内存模型):JMM是一种保证多线程之间有效的正确的协同工作的机制。

    JMM有三个关键技术:原子性,可见性,有序性

    (1)原子性:原子性是指一个操作是不可中断的,即一个操作开始,就不会被打扰。

    (2)可见性:可见性是指当一个线程修改了共享变量的值,其他线程能不能知道。在一个操作中修改了变量,在后续操作中操作的值一定是修改之后的。

    (3)有序性:程序在执行时,指令可能重排,重排后的指令与原指令顺序不一定一致。

    Java使用了一些特殊的操作或者特殊的关键字,来告诉虚拟机,哪些地方不能随意变动,哪些地方要格外小心。

    volatile就是这样一个关键字,它会告诉虚拟机,这个地方会经常修改,所以要格外小心。

    它能保证程序的有序性和可见性,但是不能保证复合操作的原子性,比如给一个int变量i加上它,当i+=1的时候,它并不能保证该操作的原子性。因为中间经历了取值,操作,赋值三个步骤。

    再说synchronize,它是用来线程同步的,能保证原子性,可见性,有序性,被它修饰的代码块,一次只有一个线程能够进去。

    synchronize有三种用法:

    (1)给指定对象加锁:对给定对象加锁,在操作前必须获得对象的锁

    (2)直接作用于实例方法:相当于给当前实例加锁,在操作前要获得实例的锁(Vector,Hashtable)

    (3)直接作用于静态方法:相当于对当前类加锁,操作前要获得类的锁

    要注意对象,类,实例的区别。

  • 相关阅读:
    thinkphp下载远程图片到本地
    centos6.5安装sublime text 2
    centos6.5安装node.js
    thinkphp分页搜索条件带中文参数
    netbean快捷键
    caffe+NVIDIA安装+CUDA7.5+ubuntu14.04(显卡GTX1080)
    poj 1410 Intersection
    安装openblas和matcaffe时遇到的问题
    ubuntu 14.04 安装matlab2015b(破解版),具体软件请访问我的网盘~
    FasterRCNN编译使用及相应问题解决
  • 原文地址:https://www.cnblogs.com/blogofjzq/p/9377793.html
Copyright © 2011-2022 走看看