此处用一个小程序来说明一下,逻辑是一个计数器(int i);主要的逻辑功能是,如果同步监视了资源i,则不输出i的值,但如果没有添加关键字synchronized,因为是两个线程并发执行,所以会输出i的值,类实现Runnable接口。

  下面是run()方法,利用i一次加二,若是奇数则输出,若输出(则为并发编程,共享资源没有被监视),若没有输出(则共享资源被监视,一次只允许一个线程使用),Runnable接口的Run方法如下所示:

public void run(){while(true){if(this.getValue()%2!=0){System.out.println(this.getValue());}if(Thread.currentThread().getName().equals("b")){this.next();}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}

  在分别写一个得到i值的方法,和增加i值的方法,若是同步监视的并发线程要加synchronized,若不是可不加,自行比较结果:

 public synchronized void next(){ //此处的synchronized,定义了此处代码块,只允许一个线程访问i+=2;//i一次性加二
     }public synchronized int getValue(){return i;}
//得到i的值,进行输出判断

  在类中创建一个主方法,构造一个对象,实例化两个线程,补充一点,synchronized关键字修饰的代码块,只允许同一个对象的不同线程至多一次访问,而如果构造了两个对象那么synchronized修饰的代码块,依然会被同时访问,容易造成数据混乱,死锁的现象。

  代码如下:

 public static void main(String[] args){SecondThread st = new SecondThread();Thread st1 = new Thread(st,"a");Thread st2 = new Thread(st,"b");st1.start();st2.start();try {st1.join();st1.join();} catch (InterruptedException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}

  输出为(无输出,且线程不销毁):

  若是去除掉synchronized,能输出奇数。

转载于:https://www.cnblogs.com/xiangxi/p/4694379.html

Java并发编程实例(synchronized)相关推荐

  1. java 并发编程实例_Java并发编程案例解读

    经过前面几节的学习,了解了多线程概念.Thread类的应用.多线程数据同步存在的问题及解决方法.本节给出一个并发编程实例应用案例,通过案例的学习,可以灵活地把多线程知识应用到实际编程中,解决在项目开发 ...

  2. Java 并发编程:Synchronized 及其实现原理

    作者:liuxiaopeng 原文链接: www.cnblogs.com/paddix/p/5367116.html 一.Synchronized的基本使用 Synchronized是Java中解决并 ...

  3. Java并发编程:synchronized

    虽然多线程编程极大地提高了效率,但是也会带来一定的隐患.比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据.今天我们就来一起讨论下线程安全问题,以及Java中提供 ...

  4. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质 ...

  5. java 5 线程 睡眠,Java并发编程实例--5.线程睡眠

    有时候我们需要让线程在一段时间内不做任何事.例如某线程每个一小时检测一下传感器,剩余的时间不做任何事. 我们可以使用sleep()方法使线程睡眠,此期间不占用计算机资源. 这个方法接受一个整数表示睡眠 ...

  6. java 并发编程实例_java并发编程应用实例

    package com.juchaosoft.test; import java.util.concurrent.locks.Condition; import java.util.concurren ...

  7. Java 并发编程—Synchronized关键字

    原文作者:liuxiaopeng 原文地址:Java并发编程:Synchronized及其实现原理 目录 一.Synchronized的基本使用 二.Synchronized 原理 三.运行结果解释 ...

  8. Java并发编程—Synchronized底层优化(偏向锁、轻量级锁)

    原文作者:Matrix海 子 原文地址:Java并发编程:Synchronized底层优化(偏向锁.轻量级锁) 目录 一.重量级锁 二.轻量级锁 三.偏向锁 四.其他优化 五.总结 一.重量级锁 上篇 ...

  9. java并发编程艺术——基础篇

    这篇文章目的是为了总结一下这段时间看<java并发编程艺术>学到的东西,尝试用自己的话说出来对java多线程的理解和使用. 一.什么是多线程,为什么要用多线程,多线程带来的挑战 多线程定义 ...

最新文章

  1. struct output SVM
  2. 时尚达人必备的潮流壁纸桌面!
  3. 课堂练习 组合数据练习
  4. SAP License:老板都不懂ERP,怎么会用得好ERP呢?
  5. 数据同步Sqoop用法之mysql与Hive导入导出
  6. Android中activity的生命周期
  7. java 证书缺乏扩展项_java解析证书的例子(包括基本项目、扩展项目)
  8. linux 文件大小 自动变化 写,Linux下自动清理超过指定大小文件的方法
  9. 相亲之战,以少胜多乎?
  10. copula函数(高斯copula函数)
  11. nodejs菜鸟教程
  12. 纪念第一次2019河南省第十二届ACM大赛之旅
  13. 6.后台验证码-session作用域
  14. 关于混入(minxs)的使用
  15. 【论文解读】MacBERT: 中文自然语言预训练模型
  16. 应用计算机怎么弹ink,Win7系统打开计算机管理提示computer management.Ink的解决方法教程[多图]...
  17. THREE将左键改为平移右键改为旋转
  18. Pandas 最全的使用方式(下)
  19. GCN学习:Pytorch-Geometric教程(二)
  20. 4种解法 - 最小的k个数

热门文章

  1. selenium测试(Java)--学习总结
  2. 26Exchange Server 2010跨站点部署-内外网邮件流测试
  3. Qt控件注册事件过滤器后不显示
  4. 一个监测IIS,并定时重新启动的程序。
  5. android:descendantFocusability用法简析
  6. android handler 的removeMessages的使用
  7. https的双向认证
  8. 【Redis】17.Cluster集群结构搭建
  9. 当编程语言掌握在企业手中,是生机还是危机?
  10. 阿里Java面试题剖析:为什么使用消息队列?消息队列有什么优点和缺点?