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
//保证原子性,不保证有序性
static class Increase {
private volatile int i = 0; void increasementAndPrint() {
System.out.println(i++);
}
}
3.使用重入锁
//保证原子性和有序性
static class Increase {
private ReentrantLock reentrantLock = new ReentrantLock();
private int i = 0; void increasementAndPrint() {
reentrantLock.lock();
System.out.println(i++);
reentrantLock.unlock();
}
}
Java中同步的几种实现方式的更多相关文章
- JAVA中单例模式的几种实现方式
1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...
- Java中String对象两种赋值方式的区别
本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...
- 细说java中Map的两种迭代方式
曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...
- Java中Map的4种遍历方式
第一种方式:这是平常用的最多也最可取的一种遍历方式. for (Map.Entry<String, Object> entry : map.entrySet()) { System.out ...
- java中线程的几种实现方式
1. 继承Thread类来实现 class MyThread extends Thread{ @Override public void run() { System.out.println(&quo ...
- XML解析——Java中XML的四种解析方式
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
- Java中容器的两种初始化方式比较
List,Set,Map的两种初始化赋值方式 List List<Integer> list2 = new ArrayList<Integer>(); for (int i= ...
- java中线程的三种实现方式
一下记录下线程的3中实现方式:Thread,Runnable,Callable 不需要返回值时,建议使用Runnable:有返回值时建议使用Callable 代码如下所示: package com.f ...
- XML解析——Java中XML的四种解析方式(转载 by 龍清扬)
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
随机推荐
- ueditor图片上传和显示问题
图片上传: 这段是contorller代码 @RequestMapping(value = "/uploadImg", method = RequestMethod.POST) @ ...
- How to set up github to work with Visual Studio 2013
http://michaelcrump.net/setting-up-github-to-work-with-visual-studio-2013-step-by-step/ 1. Create gi ...
- responsiveslides 插件(图片轮播插件)
参数详解: $(".rslides").responsiveSlides({ auto: true, // Boolean: 设置是否自动播放, true or false spe ...
- Ntfs 下的链接符号创建
熟悉过 Unix/Linux 都应该知道,Unix/Linux 用 ln 建立硬链接,ln -s 建立软链接(符号链接). 硬链接和符号链接的区别 Ntfs下的也有链接符: 内置命令:mklink ...
- 【git】之修改git仓库地址
方法1 git remote set-url origin <url> 方法2 git remote rm origin git remote add origin [url] 方法三 直 ...
- Memcached 集群架构方面的问题 [z]
集群架构方面的问题 memcached是怎么工作的? Memcached的神奇来自两阶段哈希(two-stage hash).Memcached就像一个巨大的.存储了很多<key,v ...
- 【mysql】索引优化记录
基础知识 Innodb存储引擎 支持行锁 支持事务: Myisam存储引擎 只支持表锁: 不支持事务: 常见索引列表 独立的列 前缀索引(索引选择性) 多列索引(并不是多个单列索引,索引顺序很重要) ...
- 【Spring学习笔记-2.1】Spring的设值注入和构造注入
设值注入: 先通过无参数的构造函数创建一个Bean实例,然后调用对应的setter方法注入依赖关系: 配置文件: <?xml version="1.0" encoding=& ...
- bzoj4020: 未来程序·改
只需写一个解释器 第一次预处理将输入进行分词,分割出 关键字,运算符,变量/函数名,整数常量,并对变量/函数名离散化以便处理 第二次预处理建语法树,每个节点存节点类型,变量定义表等信息 运行时在语法树 ...
- java设计模式-Observe
一.背景 请模拟下面情形: 小孩在睡觉,醒来后要求吃东西 代码: class Child{ private boolean wakenUp = false; void wakeUp(){ wake ...