浅谈Java多线程同步机制之同步块(方法)——synchronized

在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享。下面代码示意三个窗口购5张火车票:

 1 package com.jikexueyuan.thread;
 2 /*
 3  * 未使用synchronized,存在并发
 4  */
 5 class RunnableDemo implements Runnable{
 6     private int tickets = 5;
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 10; i++) {
10             try {
11                 Thread.sleep(500);
12             } catch (InterruptedException e) {
13                 e.printStackTrace();
14             }
15                 if (tickets>0) {
16                     System.out.println("车票: "+tickets--);
17             }
18         }
19         
20     }
21 }
22 
23 public class ThreadTest {
24 
25     public static void main(String[] args) {
26         RunnableDemo r = new RunnableDemo();
27         Thread t1 = new Thread(r);
28         Thread t2 = new Thread(r);
29         Thread t3 = new Thread(r);
30         t1.start();
31         t2.start();
32         t3.start();
33     }
34 
35 }

其中一次的运行结果:

车票: 5
车票: 4
车票: 3
车票: 2
车票: 1
车票: 2

使用synchronized同步块后:

 1 package com.jikexueyuan.thread;
 2 /*
 3  * 使用synchronized块
 4  */
 5 class RunnableDemo implements Runnable{
 6     private int tickets = 5;
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 10; i++) {
10             try {
11                 Thread.sleep(500);
12             } catch (InterruptedException e) {
13                 e.printStackTrace();
14             }
15             synchronized (this) {
16                 if (tickets>0) {
17                     System.out.println("车票: "+tickets--);
18                 }
19             }
20         }
21     }
22 }
23 
24 public class ThreadTest {
25 
26     public static void main(String[] args) {
27         RunnableDemo r = new RunnableDemo();
28         Thread t1 = new Thread(r);
29         Thread t2 = new Thread(r);
30         Thread t3 = new Thread(r);
31         t1.start();
32         t2.start();
33         t3.start();
34     }
35 
36 }

使用synchronized同步方法:

 1 package com.jikexueyuan.thread;
 2 /*
 3  * 使用synchronized同步方法
 4  */
 5 class RunnableDemo implements Runnable{
 6     private int tickets = 5;
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 10; i++) {
10             show();
11         }
12     }
13     public synchronized void show() {
14         if (tickets>0) {
15             System.out.println("车票: "+tickets--);
16         }
17     }
18 }
19 
20 public class ThreadTest {
21 
22     public static void main(String[] args) {
23         RunnableDemo r = new RunnableDemo();
24         Thread t1 = new Thread(r);
25         Thread t2 = new Thread(r);
26         Thread t3 = new Thread(r);
27         t1.start();
28         t2.start();
29         t3.start();
30     }
31 
32 }

无论使用synchronized同步块还是同步方法,运行结果均为合理结果:

车票: 5
车票: 4
车票: 3
车票: 2
车票: 1


思考:volatile是另一种同步机制,是否可以呢?参考我的链接文章:Java理论与实践:正确使用Volatile变量 http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

转载于:https://www.cnblogs.com/Miracle-Maker/p/6262123.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]Webpack5(从入门到精通)

这里写目录标题 1、webpack 初体验 全局安装webpack2.打包样式资源 创建webpack.config.js文件&#xff08;配置文件&#xff09;3.打包html资源 webpack.config.js文件&#xff08;配置文件&#xff09;4.打包图片资源 webpack.config.js文件&#xff08;配置文件&#xff09;…

mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)...

5 mybatis开发dao的方法 5.1 SqlSession使用范围 5.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将SqlSessionFactoryBuilder当成一个工具类使用即可&#xff0c;不需要使用单例管理SqlSessionFactoryBuilder。 在需要创建SqlSes…

做⼀个⾼德地图的 iOS / Android MAUI 控件(上)

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;10分钟)Microsoft Build 2022 ⼤会上正式发布了 .NET MAUI , 对于 .NET 开发者可以⽤ C# 完成跨平台的前端应⽤开发。对⽐起 MAUI 的前身 Xamarin , MAUI 除了可以⽤传统的原⽣开发模式外&#xff0c;还⽀持了 Blazor…

易康eCognition Developer 9.01安装教程(附eCognition下载地址及中文教程)

eCognition是由德国Definiens Imaging公司2009年推出的智能化影像分析软件,2010年被美国Trimble公司收购。eCognition是目前所有商用遥感软件中第一个基于目标信息的遥感信息提取软件,它采用决策专家系统支持的模糊分类算法,突破了传统商业遥感软件单纯基于光谱信息进行影像…

[改善Java代码]不要覆写静态方法

建议33&#xff1a; 不要覆写静态方法 我们知道在Java中可以通过覆写&#xff08;Override&#xff09;来增强或减弱父类的方法和行为&#xff0c;但覆写是针对非静态方法&#xff08;也叫做实例方法&#xff0c;只有生成实例才能调用的方法&#xff09;的&#xff0c;不能针对…

C语言试题194之实现strcpy函数功能

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现st…

ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解

文章目录 一、重分类1. 新值替代2. 将值组合到一起3. 按相同等级对一组栅格的值进行重分类4. 将特定值设置为NoData 或者为 NoData像元设置某个值二、查找表三、分割四、使用表重分类五、使用ASCI文件重分类重分类就是对原有栅格像元值重新分类从而得到一组新值并输出。重分类工…

[中文版] 可视化 CSS References 文档

本文分享了我将可视化 CSS References 文档翻译成中文版的介绍&#xff0c;翻译工作还在陆续进行中&#xff0c;供学习 CSS 参考。 1. 可视化 CSS References 文档介绍 许多 CSS 的文档都是属性的介绍&#xff0c;而开源项目 css-reference 并没有提供中文版&#xff0c;而当我…

对比 C# 聊聊 C++ 中几类特殊成员函数

一&#xff1a;背景 在 C# 中要说类默认给我们定义的特殊成员函数&#xff0c;莫过于 构造函数&#xff0c;但在 C 中这样的特殊函数高达 6 种&#xff0c;有必要整合一下聊一聊。二&#xff1a;特殊成员函数 1. 默认构造函数和 C# 一样&#xff0c;很多书中都说&#xff0c;如…

Js 枚举定义Layer Icon

layer的icon有7种样式&#xff1a;1-7 [图片来自&#xff1a;https://blog.csdn.net/beauxie/article/details/60959971] 有时候常常记不住 &#x1f623;&#xff0c;不防自己定义一哈&#xff1a; var layerIcon {//无none: -1,//成功success: 1,//失败error: 2,//提问、疑…

前端进阶之路: 前端架构设计(2)-流程核心

可能很多人和我一样, 首次听到"前端架构"这个词, 第一反应是: "前端还有架构这一说呢?" 在后端开发领域, 系统规划和可扩展性非常关键, 因此架构师备受重视, 早在开发工作启动之前, 他们就被邀请加入到项目中, 而且他们会跟客户讨论即将建成的平台的架构要…

C语言试题195之实现strnchr函数功能

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现strnchr函数功能 函数名称:在字符串中查找字符 函数原型:char *strnchr(cons…

8.2设备文件及磁盘分区

2019独角兽企业重金招聘Python工程师标准>>> 概览&#xff1a; 设备文件的创建 权限 设备名 类型 主设备号 次设备号 mknod [-m MODE] NAME type [MAJOR MINOR] 创建时&#xff0c;先查看是否存在设备号的冲突 零磁道零扇区是MBR&#xff1a;Maste…

【ArcGIS风暴】ArcGIS求一个矢量图层中多个图斑的“四至点”坐标案例教程

如图所示,为ArcGIS软件自带的全球矢量数据,怎样求取每个大洲(图斑)的四至坐标(xmin、ymin、xmax、ymax)呢? 参考阅读:【ArcGIS遇上Python】python批量获取栅格数据四至(top,bottom,left,right)坐标代码 文章目录 1. 矢量数据加载2. 四至计算结果3. 四至计算过程1.…

一个关于导出excel模板的实例

1 首先jsp页面 点击模板下载&#xff0c;会自动下载模板&#xff45;&#xff58;&#xff43;&#xff45;&#xff4c;&#xff0c;效果如下 让我们看源码&#xff1a; &#xff11; &#xff4a;&#xff53;&#xff50;页面 <div class"tab-pane" id"p…

腾讯视频VIP会员,周卡特价9.5元!

今天给大家推荐特价充值腾讯视频VIP会员的平台——幻海优品&#xff0c;腾讯视频在线直充&#xff0c;VIP会员实时生效&#xff01;腾讯视频VIP会员特价充值周卡&#xff1a;原价12元&#xff0c;特价9.5元月卡&#xff1a;原价30元&#xff0c;特价22元季卡&#xff1a;原价68…

解决安装SQL Server 2005开发版时,出现“SQL Server 服务无法启动 ”点击重试或取消的解决方法

问题描述&#xff1a; 安装SQL Server 2005开发版时&#xff0c;提示SQL Server服务无法启动&#xff0c;有关详细信息&#xff0c;请参阅SQL Server联机丛书中的主题如何查看SQL Server 2005安装日志文件和手动启动SQL Server&#xff0c;如下图所示。 此时&#xff0c;如果点…

C语言试题196之实现strstr函数功能

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现strstr函数功能 C 库函数 char *strstr(const char *haystack, const char *nee…

svnsync实现版本库的同步备份

svnsync实现版本库的同步备份 实验环境&#xff1a;A&#xff0c;172.17.201.243&#xff08;主&#xff09;B&#xff0c;172.17.201.88&#xff08;备&#xff09;项目需求&#xff0c;生产环境要求svn服务器实现热备机制&#xff0c;于是就想到了svn自带的svnsync机制&#…

关于数据结构(二)

文章目录[点击展开](?)[] 一UI返回功能思路分析实现方法二当前正在CD技能接着上文<<关于数据结构(一)>>&#xff0c;关于数据结构&#xff0c;在实际的开发中或多或少都有涉及到&#xff0c;只是看自己平时没有积累到。下面是我在项目中的几个实例&#xff1a; 一…