当前位置: 首页 > news >正文

java 方法前加同步_Java同步的三种实现方式详解

1.使用synchronized关键字修饰类或者代码块;

2.使用Volatile关键字修饰变量;

3.在类中加入重入锁

举例子:多个线程在处理一个共享变量的时候,就会出现线程安全问题。(相当于多个窗口卖票的操作)

非同步状态下:

public static void main(String[] args){

Increase increase = new Increase();

int count = 10;

while (count != 0){

new Thread(() -> {

increase.increasementAndPrint();

}).start();

count --;

}

}

static class Increase {

private int i = 0;

void increasementAndPrint() {

System.out.print(i++ + "\n");

}

}

这种情况下可能会导致多个线程输出的i相同:

0

0

1

2

3

4

5

6

7

8

使用同步:

1.使用synchronized关键字

//保证原子性和有序性

static class Increase {

private int i = 0;

synchronized void increasementAndPrint() {

System.out.println(i++);

}

}

2.使用volatile

//不保证原子性(一个被volatile声明的变量主要有可见性,有序性)

static class Increase {

private volatile int i = 0;

void increasementAndPrint() {

System.out.println(i++);

}

}

volatile关键字不一定能够保证线程安全的问题,其实,在大多数情况下volatile还是可以保证变量的线程安全问题的。所以,在满足以下两个条件的情况下,volatile就能保证变量的线程安全问题:

运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。

3.使用重入锁

//保证原子性和有序性

static class Increase {

private ReentrantLock reentrantLock = new ReentrantLock();

private int i = 0;

void increasementAndPrint() {

reentrantLock.lock();

System.out.println(i++);

reentrantLock.unlock();

}

}

相关文章:

  • mysql 事务的作用_使用Mysql事务的优点
  • java和android架构公众号_Android仿微信公众号界面
  • 连连看的连线怎么写java_求助 这个连连看的方法地方该怎么写
  • php java字节流_php中stream(流)的用法
  • java自动雨刷系统_【图文】汽车自动雨刷的使用指南
  • php 多线程处理_PHP CURL 多线程操作代码实例
  • php定义函数打印表格内容,php 自定义函数实现将数据 以excel 表格形式导出示例...
  • nodejs与php混合,php与nodejs的加密数据互通
  • php参数特殊字符,PHP中URL中特殊字符引起的问题(+,=) 分析及解决方法
  • php 鼠标点击其他区域下拉框隐藏,jQuery除指定区域外点击任何地方隐藏DIV功能...
  • java 日期转换星期,关于JAVA的小工具(日期转周几)
  • PHP的经典程序,几款经典php分页程序(1/4)
  • java gzip加解秘,vue 基于pako.js实现gzip的压缩和解压功能
  • matlab每一行白点个数,MATLAB 简单的计算白色轮廓中像素点的个数
  • java 类共享变量,Java提供了ThreadLocal(java.lang)类,实现线程内共享变量
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • crontab执行失败的多种原因
  • FastReport在线报表设计器工作原理
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Python爬虫--- 1.3 BS4库的解析器
  • Redux系列x:源码分析
  • Vultr 教程目录
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 简析gRPC client 连接管理
  • 聚类分析——Kmeans
  • 开发基于以太坊智能合约的DApp
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 深入浏览器事件循环的本质
  • 微信公众号开发小记——5.python微信红包
  • 为什么要用IPython/Jupyter?
  • 我从编程教室毕业
  • 我有几个粽子,和一个故事
  • 《码出高效》学习笔记与书中错误记录
  • 通过调用文摘列表API获取文摘
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​比特币大跌的 2 个原因
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #NOIP 2014#Day.2 T3 解方程
  • (1) caustics\
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (day6) 319. 灯泡开关
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (solr系列:一)使用tomcat部署solr服务
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (剑指Offer)面试题34:丑数
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (轉貼) UML中文FAQ (OO) (UML)
  • .gitignore文件—git忽略文件
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core Swagger 过滤部分Api
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net Stream篇(六)