<转:http://blog.csdn.net/uniquewonderq/article/details/48113071>

程序举例:

代码:

[java] view plaincopy
  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. }

代码示例:

[java] view plaincopy
  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 多线程变量可见性_Java多线程:易变变量,事前关联和内存一致性

    java 多线程变量可见性 什么是volatile变量? volatile是Java中的关键字. 您不能将其用作变量或方法名称. 期. 我们什么时候应该使用它? 哈哈,对不起,没办法. 当我们在多线程 ...

  2. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

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

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

  4. Java多线程之可见性之volatile

    可见性 一个线程对主内存的修改可以及时被其它线程观察到 导致共享变量在线程间不可见的原因 线程交叉执行 指令重排序加上线程交叉执行 共享变量更新后的值没有在工作内存与主存间及时更新 保证可见性和原子性 ...

  5. 【Java进阶营】JAVA多线程基础学习二:synchronized

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

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

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

  7. Java 并发编程_详解 synchronized 和 volatile

    文章目录 1. synchronized 的应用 1.1 基础知识 1.2 synchronized 语法 2. Monitor概念 3. Synchronized原理进阶 3.1 对象头格式 3.2 ...

  8. Java多线程的同步机制:synchronized

    如果程序是单线程的,就不必担心此线程在执行时被其他线程"打扰",就像在现实世界中,在一段时间内如果只能完成一件事情,不用担心做这件事情被其他事情打扰.但是,如果程序中同时使用多线程 ...

  9. Java多线程学习十二: synchronized的工作原理 以及背后的“monitor 锁”

    我们研究下 synchronized 背后的 monitor 锁. 获取和释放 monitor 锁的时机 我们都知道,最简单的同步方式就是利用 synchronized 关键字来修饰代码块或者修饰一个 ...

  10. 【转载】Java多线程编程2--同步锁定--synchronized同步方法、脏读、锁重入

        线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 1.方法内的变量为线程安全   "非线程安全"问题存在于"实例变量"中,如果是方法内 ...

最新文章

  1. 潘石屹Python考试成绩99分,网友:还有一分怕你骄傲
  2. javascript this指针详解
  3. oracle adf 使用,ORACLE ADF 问题总结
  4. python基础教程微信_用Python实现让微信地球转起来附代码!
  5. android layout 点击,Tips_Android点击事件(Down、Move、Up)的分发_重写Layout响应拖动事件...
  6. 转 Intellij中的常用快捷键
  7. You can't specify target table 'myusertable' for ......in FROM clause
  8. mysql启动失败LSB_MySQL数据库服务启动失败
  9. 基于代数距离的椭圆拟合
  10. 【渝粤题库】陕西师范大学700005 遗传学
  11. 计算机组成原理AB什么运算,计算机组成原理运算器实验.doc
  12. 云商城云小店官网源码-修复30套模板支持一键对接各大系统
  13. ios -特殊符号大全分享给大家,直接复制粘贴就可以使用了!
  14. linux vmware时间问题
  15. 腾讯云服务器安装AMH控制面板
  16. 图像处理中的差分求导计算和相应的卷积核(filter)
  17. ubuntu20.04安装无线网卡驱动
  18. 2022-8-03 第七小组 黄均睿 学习日记 (day27)线程2
  19. 体验Android:个人所得税计算器 含源码
  20. html一个大网页5个小网页,5个范例告诉你:什么是自适应网页设计

热门文章

  1. Atitit 游戏引擎---物理系统(1)------爆炸效果
  2. atitit.导出excel的设计----查询结果 导出为excel的实现java .net php 总结
  3. paip.提升用户体验-----用户注册设计
  4. Rust : Json Web Token
  5. 华为招聘产业联盟高级专家、 开发者生态专家
  6. 【手指识别】基于matlab GUI指尖图像采集与检测【含Matlab源码 585期】
  7. 【优化求解】基于matlab改进的灰狼算法求解重油热解优化模型【含Matlab源码 164期】
  8. 硕士转行学python_0基础转行编程学习Python是最快的途径吗?
  9. ai 道德_AI如何提升呼叫中心的道德水平?
  10. c语言儿童教学_五岁儿童的自然语言处理