程序举例:

代码:

  1. package com.synch;
  2. public class SynchronizedDemo {
  3. //共享变量
  4. private boolean ready = false;
  5. private int result = 0;
  6. private int number = 1;
  7. //写操作
  8. public synchronized void write(){
  9. ready = true;
  10. number = 2;
  11. }
  12. //读操作
  13. public synchronized void read(){
  14. if(ready){
  15. result = number*3;
  16. }
  17. System.out.println("result的值为:" + result);
  18. }
  19. //内部线程类
  20. private class ReadWriteThread extends Thread {
  21. //根据构造方法中传入的flag参数,确定线程执行读操作还是写操作
  22. private boolean flag;
  23. public ReadWriteThread(boolean flag){
  24. this.flag = flag;
  25. }
  26. @Override
  27. public void run() {
  28. if(flag){
  29. //构造方法中传入true,执行写操作
  30. write();
  31. }else{
  32. //构造方法中传入false,执行读操作
  33. read();
  34. }
  35. }
  36. }
  37. public static void main(String[] args)  {
  38. SynchronizedDemo synDemo = new SynchronizedDemo();
  39. //启动线程执行写操作
  40. synDemo .new ReadWriteThread(true).start();
  41. //      try {
  42. //          Thread.sleep(1000);
  43. //      } catch (InterruptedException e) {
  44. //          // TODO Auto-generated catch block
  45. //          e.printStackTrace();
  46. //      }
  47. //启动线程执行读操作
  48. synDemo.new ReadWriteThread(false).start();
  49. }
  50. }

代码示例:

  1. package com.synch;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4. public class VolatileDemo {
  5. private Lock lock = new ReentrantLock();
  6. private int number = 0;
  7. public int getNumber(){
  8. return this.number;
  9. }
  10. public void increase(){
  11. try {
  12. Thread.sleep(100);
  13. } catch (InterruptedException e) {
  14. // TODO Auto-generated catch block
  15. e.printStackTrace();
  16. }
  17. lock.lock();
  18. try {
  19. this.number++;
  20. } finally {
  21. lock.unlock();
  22. }
  23. }
  24. /**
  25. * @param args
  26. */
  27. public static void main(String[] args) {
  28. // TODO Auto-generated method stub
  29. final VolatileDemo volDemo = new VolatileDemo();
  30. for(int i = 0 ; i < 500 ; i++){
  31. new Thread(new Runnable() {
  32. @Override
  33. public void run() {
  34. volDemo.increase();
  35. }
  36. }).start();
  37. }
  38. //如果还有子线程在运行,主线程就让出CPU资源,
  39. //直到所有的子线程都运行完了,主线程再继续往下执行
  40. while(Thread.activeCount() > 1){//让所有的子线程都执行完后,然后再执行<pre name="code" class="java">//System.out.println("number : " + volDemo.getNumber());   语句。因为主线程算一个。当活跃线程为1时,也就是所有的子线程执行完毕了。此///时退出while 循环执行输出语句。

Thread.yield();}System.out.println("number : " + volDemo.getNumber());}}



Java多线程之可见性与原子性——synchronized VS volatile的更多相关文章

  1. java并发之可见性与原子性:Syncronized和volatile

    转载:http://blog.csdn.net/guyuealian/article/details/52525724 在说明Java多线程内存可见性之前,先来简单了解一下Java内存模型.     ...

  2. Java多线程学习(二)synchronized关键字(2)

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  3. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  4. Java多线程中提到的原子性和可见性、有序性

    1.原子性(Atomicity)   原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并发的情况下,就不会出 ...

  5. java多线程补:充原子性和可见性

    参考:http://www.cnblogs.com/mengyan/archive/2012/08/22/2651575.html 原子性:所谓原子性就是不可分割的,比如:在我们编程中直接给变量赋值, ...

  6. Java-JUC(二):Java内存模型可见性、原子性、有序性及volatile具有特性

    1.Java HotSpot JVM运行时数据区 Java内存模型即Java Memory Model,简称JMM.JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式.JVM是整 ...

  7. java线程-java多线程之可见性

    可见性:一个线程对共享变量值的修改,能够及时呗其他线程看到. 共享变量:如果一个变量在多个线程的内存中都存在副本,那么这个变量就是这几个线程的共享变量. java内存模型(JMM) 描述了java程序 ...

  8. JAVA多线程基础学习二:synchronized

    本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题,没错就是使用synchronized. 一.如何解决线程安全问题? 一般 ...

  9. Java线程(二):线程同步synchronized和volatile

    上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...

随机推荐

  1. springmvc访问静态资源出现Request method 'GET' not supported

    答案最后.:D 默认的访问的URL都会被DispatcherServlet所拦截. 这里说一下如何配置springmvc访问静态文件. <mvc:default-servlet-handler/ ...

  2. DevExpressXtraReport—制作雷达图

    存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========================================== ...

  3. 华为手机使用objectAnimation异常

    在一个recyclerView上实现item的立体翻转动画,魅族.小米.华为平板都试过了没问题,但是在一个7.0的华为手机上,只要一翻转item就消失了,网上发现也有其他人遇到这种问题,大概是obje ...

  4. Sublime运行Matlab

    使用Sublime来作为Matlab的编辑器.Sublime编辑+Matlab命令行(terminal)运行的开发环境搭建. 前期准备 Matlab 2014a (Windows或Linux平台,这里 ...

  5. 【转】腾讯移动品质中心TMQ [腾讯 TMQ] 测试管理平台大比拼

    简介 测试管理平台是贯穿测试整个生命周期的工具集合,它主要解决的是测试过程中团队协作的问题,比如缺陷管理.用例管理.测试任务管理等. 目前市面上比较流行的测试管理工具有QC. Mantis. BugZ ...

  6. Linux 文件编码格式转换

    如果需要在Linux 中操作windows下的文件,那么经常遇到文件编码转换的问题. Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-. 查看文件编码 在vim 中 ...

  7. Tomcat server.xml 配置虚拟目录

    对于Tomcat,打开..\Tomcat 6.0\conf\server.xml文件,找到下面的一行代码(Host)然后在这一行之间下面添加配置代码:<Context path="&q ...

  8. linux 将终端进行换行

    原始 修改 修改方法 vim .bashrc fi if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($debia ...

  9. OpenGL OBJ模型加载.

    在我们前面绘制一个屋,我们可以看到,需要每个立方体一个一个的自己来推并且还要处理位置信息.代码量大并且要时间.现在我们通过加载模型文件的方法来生成模型文件,比较流行的3D模型文件有OBJ,FBX,da ...

  10. OpenGL 用三角形模拟生成球面

    在看OpenGL红皮书,看到生成球体这节,讲了很多,总感觉不如自己动手写一些代码来的实在,用OpenGL中三角形模拟球形生成.主要要点,模型视图变换,多边形表面环绕一致性,矩阵堆栈.先贴上代码. 虽然 ...