Java并发编程实例(synchronized)
此处用一个小程序来说明一下,逻辑是一个计数器(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)相关推荐
- java 并发编程实例_Java并发编程案例解读
经过前面几节的学习,了解了多线程概念.Thread类的应用.多线程数据同步存在的问题及解决方法.本节给出一个并发编程实例应用案例,通过案例的学习,可以灵活地把多线程知识应用到实际编程中,解决在项目开发 ...
- Java 并发编程:Synchronized 及其实现原理
作者:liuxiaopeng 原文链接: www.cnblogs.com/paddix/p/5367116.html 一.Synchronized的基本使用 Synchronized是Java中解决并 ...
- Java并发编程:synchronized
虽然多线程编程极大地提高了效率,但是也会带来一定的隐患.比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据.今天我们就来一起讨论下线程安全问题,以及Java中提供 ...
- Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质 ...
- java 5 线程 睡眠,Java并发编程实例--5.线程睡眠
有时候我们需要让线程在一段时间内不做任何事.例如某线程每个一小时检测一下传感器,剩余的时间不做任何事. 我们可以使用sleep()方法使线程睡眠,此期间不占用计算机资源. 这个方法接受一个整数表示睡眠 ...
- java 并发编程实例_java并发编程应用实例
package com.juchaosoft.test; import java.util.concurrent.locks.Condition; import java.util.concurren ...
- Java 并发编程—Synchronized关键字
原文作者:liuxiaopeng 原文地址:Java并发编程:Synchronized及其实现原理 目录 一.Synchronized的基本使用 二.Synchronized 原理 三.运行结果解释 ...
- Java并发编程—Synchronized底层优化(偏向锁、轻量级锁)
原文作者:Matrix海 子 原文地址:Java并发编程:Synchronized底层优化(偏向锁.轻量级锁) 目录 一.重量级锁 二.轻量级锁 三.偏向锁 四.其他优化 五.总结 一.重量级锁 上篇 ...
- java并发编程艺术——基础篇
这篇文章目的是为了总结一下这段时间看<java并发编程艺术>学到的东西,尝试用自己的话说出来对java多线程的理解和使用. 一.什么是多线程,为什么要用多线程,多线程带来的挑战 多线程定义 ...
最新文章
- struct output SVM
- 时尚达人必备的潮流壁纸桌面!
- 课堂练习 组合数据练习
- SAP License:老板都不懂ERP,怎么会用得好ERP呢?
- 数据同步Sqoop用法之mysql与Hive导入导出
- Android中activity的生命周期
- java 证书缺乏扩展项_java解析证书的例子(包括基本项目、扩展项目)
- linux 文件大小 自动变化 写,Linux下自动清理超过指定大小文件的方法
- 相亲之战,以少胜多乎?
- copula函数(高斯copula函数)
- nodejs菜鸟教程
- 纪念第一次2019河南省第十二届ACM大赛之旅
- 6.后台验证码-session作用域
- 关于混入(minxs)的使用
- 【论文解读】MacBERT: 中文自然语言预训练模型
- 应用计算机怎么弹ink,Win7系统打开计算机管理提示computer management.Ink的解决方法教程[多图]...
- THREE将左键改为平移右键改为旋转
- Pandas 最全的使用方式(下)
- GCN学习:Pytorch-Geometric教程(二)
- 4种解法 - 最小的k个数