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();
}
}
Java同步的三种实现方式的更多相关文章
- Java多线程的三种实现方式
		java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ... 
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
		一.list简介 List列表类,顺序存储任何对象(顺序不变),可重复. List是继承于Collection的接口,不能实例化.实例化可以用: ArrayList(实现动态数组),查询快(随意访问或 ... 
- Java定时器的三种实现方式
		一.普通thread /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现, ... 
- Java数组的三种打印方式
		1.数组的输出的三种方式 一维数组: 定义一个数组 int[] array = {1,2,3,4,5}; (1)传统的for循环方式 for(int i=0;i<array.length;i++ ... 
- Java反射的三种实现方式
		Foo foo = new Foo(); 第一种:通过Object类的getClass方法 Class cla = foo.getClass(); 第二种:通过对象实例方法获取对象 Class cla ... 
- java 代理的三种实现方式
		Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ... 
- java 多线程编程三种实现方式
		一种是继承Thread类,一种是实现Runable接口,还有一种是实现callable接口: 有博主说只有前面2种方式,我个人愚见是三种,主要详细介绍下callable的使用: 三种线程的我的个人理解 ... 
- java集合的三种遍历方式
		import java.util.ArrayList; import java.util.Collection;import java.util.Iterator;public class Home ... 
- java线程的三种实现方式
		线程实现的三种种方式: 一个是继承Thread类,实现run()方法: 一个是实现Runnable接口,实现run()方法: 一个是实现Callable接口,实现call()方法:该方式和实现Runn ... 
随机推荐
- hdu_1859_最小长方形_201402282048
			最小长方形 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ... 
- C - Reading comprehension  二分法 求等比数列前N项和
			Read the program below carefully then answer the question. #pragma comment(linker, "/STACK:1024 ... 
- [转]十五天精通WCF——第一天 三种Binding让你KO80%的业务
			转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了, 再简单的话马路上的大妈也能写wcf了 ... 
- 『Spring.NET+NHibernate+泛型』框架搭建之Model(二)
			依照搭建项目的顺序来比較好描写叙述一些,我一般先搭建实体层,本节内容纯属于NHibernate范畴.先上图和代码,然后对着图和代码逐一解说,以角色表为例: T_Role表: 数据库表设计非常eas ... 
- ADS-B显示终端6.8
			更新日志; 本次更新依旧主要注重是BUG修正. 1 改动鼠标移动时地图重绘的BUG 鼠标移动时地图即发生重绘,占用了CPU资源,修正后仅仅当鼠标点击选中对象或拖动对象时地图才会发生重绘.极大程度上节省 ... 
- UVALive - 6910 (离线逆序并查集)
			题意:给处编号从1~n这n个节点的父节点,得到含有若干棵树的森林:然后再给出k个操作,分两种'C x'是将节点x与其父节点所连接的支剪短:'Q a b'是询问a和b是否在同一棵树中. 题解:一开始拿到 ... 
- fixed和absolute
			fixed是相对于浏览器窗口固定 absolute是相对于整体网页固定.(整体网页包括所有的内容,包含右侧滑动条滑动所能看到的内容) 
- 【BZOJ 1602】 牧场行走
			[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1602 [算法] 倍增求LCA [代码] #include<bits/stdc+ ... 
- rpmbuild
			rpm2cpio xxx.rpm | cpio -div 
- iOS手势识别
			一.手势识别与触摸事件 1.如果想监听一个view上面的触摸事件,可选的做法是: (1)自定义一个view (2)实现view的touches方法,在方法内部实现具体处理代码 2.通过touches方 ... 
