当前位置: 首页 > 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)类,实现线程内共享变量
  • python3.6+scrapy+mysql 爬虫实战
  • __proto__ 和 prototype的关系
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • C++类中的特殊成员函数
  • download使用浅析
  • ECS应用管理最佳实践
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • MySQL用户中的%到底包不包括localhost?
  • SpringCloud集成分布式事务LCN (一)
  • ucore操作系统实验笔记 - 重新理解中断
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 初识 beanstalkd
  • 创建一种深思熟虑的文化
  • 翻译--Thinking in React
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 如何胜任知名企业的商业数据分析师?
  • 说说我为什么看好Spring Cloud Alibaba
  • ​ssh免密码登录设置及问题总结
  • ​批处理文件中的errorlevel用法
  • #{} 和 ${}区别
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (007)XHTML文档之标题——h1~h6
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Forward) Music Player: From UI Proposal to Code
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (剑指Offer)面试题34:丑数
  • (七)c52学习之旅-中断
  • (一)RocketMQ初步认识
  • (转)h264中avc和flv数据的解析
  • (转)scrum常见工具列表
  • (转载)虚函数剖析
  • .Net 4.0并行库实用性演练
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 反编译_.net反编译的相关问题
  • .net 生成二级域名
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换