volatile该关键字是主要使用的场合是字啊多个线程中可以感知实例的变量被更改了并且可以获取到最新的值进行使用,也就是用多线程读取共享变量的时候可以获取到最新的值使用。不能保障原子性

如果你在jvm中传递-server时候会导致这个运行的栈会在私有内存中而不是在共享内存中。

而synchronized是指的是同步的关键字,也就是说这个是线程同步的关键字。可以保障数据在并发的时候保证数据的原子性

测试代码:

MyThreadByVolatile

 package cn.lonecloud;
/**
* 使用volatile关键字进行限制
* @Title: MyThreadByVolatile.java
* @Package cn.lonecloud
* @Description:
* @author lonecloud
* @date 2016年9月5日 下午4:08:00
*/
public class MyThreadByVolatile extends Thread{
//添加volatile关键字
volatile public static int m=0;
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
m++;
}
System.out.println(Thread.currentThread().getName()+" "+m);
}
}

MyThreadBySynchronized

 package cn.lonecloud;
/**
* 使用synchronized同步方法进行
* @Title: MyThreadBySynchronized.java
* @Package cn.lonecloud
* @Description:
* @author lonecloud
* @date 2016年9月5日 下午4:08:56
*/
public class MyThreadBySynchronized extends Thread {
public static int m=0;
@Override
synchronized public void run() {
for (int i = 0; i < 100; i++) {
m++;
}
System.out.println(Thread.currentThread().getName()+" "+m);
}
}

VolatileTest

 package cn.lonecloud;
/**
* 测试类
* @Title: VolatileTest.java
* @Package cn.lonecloud
* @Description:
* @author lonecloud
* @date 2016年9月5日 下午4:09:15
*/
public class VolatileTest {
public static void main(String[] args) {
Thread thread[]=new Thread[100];
for (int i = 0; i < 100; i++) {
thread[i]=new MyThreadByVolatile();//结果为99591总是少
// thread[i]=new MyThreadBySynchronized();
}
for (int i = 0; i < thread.length; i++) {
thread[i].start();
}
}
}

结果如果使用volatile没有保证数据的稳定

使用synchronized则有

Java中的volatile的作用和synchronized作用的更多相关文章

  1. java中的volatile关键字

    java中的volatile关键字 一个变量被声明为volatile类型,表示这个变量可能随时被其他线程改变,所以不能把它cache到线程内存(如寄存器)中. 一般情况下volatile不能代替syn ...

  2. 深入理解Java中的volatile关键字

    在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized ...

  3. java中的Volatile关键字使用

    文章目录 什么时候使用volatile Happens-Before java中的Volatile关键字使用 在本文中,我们会介绍java中的一个关键字volatile. volatile的中文意思是 ...

  4. Java中的volatile关键字的功能

    Java中的volatile关键字的功能 volatile是java中的一个类型修饰符.它是被设计用来修饰被不同线程访问和修改的变量.如果不加入volatile,基本上会导致这样的结果:要么无法编写多 ...

  5. 一定要你明白Java中的volatile

    今天Tony来和大家聊聊Java中关键字volatile. 字节码 首先volatile int a = 3;和int a = 3;, 加不加volatile关键字,最终生成的字节码都一样的.有兴趣的 ...

  6. java中关键字volatile的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

  7. java中的volatile和synchronized

    关于volatile和同步相关的东西,网上有太多错误和解释不清的东西, 所以查阅相关书籍和文章后总结如下, 如果还是也存在不正确的内容,请一定要指出来, 以免误人子弟:) 1. 原子性与可视性 原子性 ...

  8. java多线程关键字volatile、lock、synchronized

    --------------------- 本文来自 旭日Follow_24 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xuri24/article/detail ...

  9. Java中的volatile关键字为什么不是不具有原子性

    Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值是原子操作,为什么?为什么volatile能替代简单的锁,却不能保证原子性?这里面涉及volat ...

  10. [读书笔记]java中的volatile关键词

    以下内容大多来自周志明的<深入理解Java虚拟机>. 当一个变量被volatile修饰后,它将具备两种特性: 1. 保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变 ...

随机推荐

  1. Python3基础知识之元组、集合、字典

    1.元组 元组特点元组是不可变的两个元组可以做加法,不能做减法 元组的方法 >>> S('a', 'b', 'c', 'd', 'e')>>> S=('a','b' ...

  2. .net 和 core2.0 数据库连接字符串

    Asp.net Core 数据库离线文件的连接(引自“张不水”兄的研究成果.) 一.绝对路径: "DefaultConnection": "Data Source=(lo ...

  3. BIGIP-LTM中的NAT和SNAT

      http://250688049.blog.51cto.com/643101/1095880 一.NAT(Network Address Translation)网络地址转换1.NAT简介 NAT ...

  4. linux_定时任务

    什么是定时任务? linux系统自身定期执行的任务和工作: 轮训系统日志.备份系统数据.清理缓存等 var/log/messages # 系统日志文件, ll /etc/|grep cron # 查询 ...

  5. MS SQL 日志记录管理

    MS SQL的日志信息/日志记录,可能对你来说,既熟悉又陌生,熟悉是因为你可能一直都在使用,查看.关注一些日志信息/记录,例如,作业历史记录:陌生是因为你可能从不关注日志信息/记录的管理,这里我一直用 ...

  6. Jquery实现弹出层效果

    <script type="text/javascript"> $(document).ready(function(){ $('.one').click(functi ...

  7. Android Studio打包APK时出现 is not translated in "en" (English) [MissingTranslation]

    错误信息: Error:(16) Error: "baidutieba_client_inavailable" is not translated in "en" ...

  8. PHP中文网上的分页代码

    page.php <html> <head> <meta http-equiv="CONTENT-TYPE" content="text/h ...

  9. Python笔记001-----简介及常用的库

    1.Python是一种解释性语言,大部分代码要比编译型语言(如C++,java等)运行要慢点多.2.对于高并发,多线程的应用程序而言,Python并不是理想语言,python有全局解释器锁(Globa ...

  10. slick对超过22个属性的表进行映射的两种办法

    版权声明:本文为博主原创文章,未经博主允许不得转载 slick是scala的一个FRM(Functional Relational Mapper)框架,即函数式的关系数据库编程工具库.使用slick不 ...