博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程之可见性与原子性——synchronized VS volatile
阅读量:5856 次
发布时间:2019-06-19

本文共 2031 字,大约阅读时间需要 6 分钟。

 

 

 

 

 

 

 

 

 

 

 

程序举例:

代码:

 

[java]   
 
  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.     //内部线程类  
  21.     private class ReadWriteThread extends Thread {  
  22.         //根据构造方法中传入的flag参数,确定线程执行读操作还是写操作  
  23.         private boolean flag;  
  24.         public ReadWriteThread(boolean flag){  
  25.             this.flag = flag;  
  26.         }  
  27.         @Override                                                                      
  28.         public void run() {  
  29.             if(flag){  
  30.                 //构造方法中传入true,执行写操作  
  31.                 write();  
  32.             }else{  
  33.                 //构造方法中传入false,执行读操作  
  34.                 read();  
  35.             }  
  36.         }  
  37.     }  
  38.   
  39.     public static void main(String[] args)  {  
  40.         SynchronizedDemo synDemo = new SynchronizedDemo();  
  41.         //启动线程执行写操作  
  42.         synDemo .new ReadWriteThread(true).start();  
  43. //      try {  
  44. //          Thread.sleep(1000);  
  45. //      } catch (InterruptedException e) {  
  46. //          // TODO Auto-generated catch block  
  47. //          e.printStackTrace();  
  48. //      }  
  49.         //启动线程执行读操作  
  50.         synDemo.new ReadWriteThread(false).start();  
  51.     }  
  52. }  

 

 

 

 

 

 

 

 

 

 

 

代码示例:

 

[java]   
 
  1. package com.synch;  
  2.   
  3. import java.util.concurrent.locks.Lock;  
  4. import java.util.concurrent.locks.ReentrantLock;  
  5.   
  6. public class VolatileDemo {  
  7.   
  8.     private Lock lock = new ReentrantLock();  
  9.     private int number = 0;  
  10.       
  11.     public int getNumber(){  
  12.         return this.number;  
  13.     }  
  14.       
  15.     public void increase(){  
  16.         try {  
  17.             Thread.sleep(100);  
  18.         } catch (InterruptedException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         }  
  22.         lock.lock();  
  23.         try {  
  24.             this.number++;  
  25.         } finally {  
  26.             lock.unlock();  
  27.         }  
  28.     }  
  29.       
  30.     /** 
  31.      * @param args 
  32.      */  
  33.     public static void main(String[] args) {  
  34.         // TODO Auto-generated method stub  
  35.         final VolatileDemo volDemo = new VolatileDemo();  
  36.         for(int i = 0 ; i < 500 ; i++){  
  37.             new Thread(new Runnable() {  
  38.                   
  39.                 @Override  
  40.                 public void run() {  
  41.                     volDemo.increase();  
  42.                 }  
  43.             }).start();  
  44.         }  
  45.           
  46.         //如果还有子线程在运行,主线程就让出CPU资源,  
  47.         //直到所有的子线程都运行完了,主线程再继续往下执行  
  48.         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());}}

 

 

 

 

 

你可能感兴趣的文章
Android事件管理源码剖析
查看>>
Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践
查看>>
跨域问题汇总
查看>>
小技巧|CSS如何实现文字两端对齐
查看>>
自己学习的笔记!!Java分支语句和循环语句
查看>>
SpringCloud(第 017 篇)电影微服务接入Feign,添加fallbackFactory属性来触发请求进行容灾降级...
查看>>
Mac 虚拟机搭建及相关命令
查看>>
PHP数组转换为js数组
查看>>
从Google Play下载应用并不安全,上千款监视软件伪装其中
查看>>
ES6之Iterator、Generator
查看>>
[译]一篇文章解决跨域
查看>>
ubuntu下搭建svn,并用钩子同步到web目录
查看>>
Spring Boot整合jsp后必须通过spring-boot:run方式启动?
查看>>
重拾css(11)——position
查看>>
20170710-Generator
查看>>
redis持久化策略浅析
查看>>
JavaScript深入之参数按值传递
查看>>
Http - 收藏集 - 掘金
查看>>
博客应该写在论坛还是个人网站?
查看>>
来 DIY 个机器人 - 收藏集 - 掘金
查看>>