多线程:线程同步的几种方式
1.synchronized同步方法 (静态方法锁住类对象,其它方法锁住实例对象)
即有synchronized关键字修饰的方法。
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,
内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
2.synchronized同步代码块 (锁住标记的对象)
即有synchronized关键字修饰的语句块。
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
3.使用ReentrantLock实现线程同步
在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。
ReenreantLock类的常用方法有:
ReentrantLock() : 创建一个ReentrantLock实例
lock() : 获得锁
代码
unlock() : 释放锁
注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用
用于线程间通信时,结合Condition进行操作
4.使用特殊域变量(volatile)实现线程同步(无法保证原子性的,写到这儿来只是强调一下,它只保证了可见性和有序性。)
a.volatile关键字为域变量的访问提供了一种免锁机制,
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
e.
对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的。
您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
· 对变量的写操作不依赖于当前值。
· 该变量没有包含在具有其他变量的不变式中。
可以使用的场景:
将volatile 变量作为状态标志使用(和lock差不多,但是volatile赋值true本来这种就是原子操作,所以就刚好可以使用。)
5.volatile(保证可见性和有序性)的一个重要作用就是和CAS结合,保证了原子性
最简单的比如i++,用volatile可以保证取得的值是最新的,而cas操作可以保证你修改前后的值只+1,而不会覆盖掉别的线程已经修改过的值,如果别的线程已经修改过,CAS会自动不修改的。
但是没有volatile时,原子性不保证可见性。
CAS改完可能值还在缓存里,不会马上把工作内存中被修改后的值 写回 主内存。
CAS只解决了比较和更新的原子性的问题,要保证可见性,需要加锁或者是用volatile修饰变量。
1. 首先,声明共享变量为volatile;
2. 然后,使用CAS的原子条件更新来实现线程之间的同步;
3. 同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。
一句话:volatile变量的读/写和CAS可以实现线程之间的通信。把这些特性整合在一起,就形成了整个concurrent包得以实现的基石。
多线程:线程同步的几种方式相关推荐
- Java线程同步的几种方式
Java线程同步的几种方式 1.使用synchronized关键字 它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性. synchronized关键字的用法: ...
- 一心多用多线程-线程创建的三种方式
第一次了解java线程机制,记录一下线程启动的三种方式. 1.通过继承Thread类调用一个线程 public class Thread1 extends Thread{@Overridepublic ...
- C++线程同步的四种方式(Windows)
原文链接: https://blog.csdn.net/s_lisheng/article/details/74278765 什么是鲜橙同步?为什么要进行线程同步? 在程序中使用多线程时,一般情况, ...
- 实现线程同步的几种方式
在多线程中线程的执行顺序是依靠哪个线程先获得到CUP的执行权谁就先执行,虽然说可以通过线程的优先权进行设置,但是他只是获取CUP执行权的概率高点,但是也不一定必须先执行.在这种情况下如何保证线程按照一 ...
- Python 线程同步的三种方式
我们使用多线程的目的通常是并发的运行单独的操作,但有时候也需要在两个或多个线程中同步操作.在Python中,线程同步有多种方式,包括Event.Condition和Barrier 方式一:Event ...
- Python线程同步的5种方式
问题的引入 import threading total = 0def add():global totalfor i in range(1000000):total += 1def desc():g ...
- photon四种同步方式_【Linux】多线程同步的四种方式
背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include #include#include#include#include#include us ...
- 15.线程同步的几种方法
一.为什么需要线程同步 线程同步通常是出现在多线程环境下的问题,对于多个线程同时访问的共享内存中的变量,如果不进行保护,就会导致一些列数据出错问题.以下图为例: 假设线程A在第一次读取变量的值为10, ...
- 关于线程同步的几种方法
java允许多线程,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突. 比方说,我们在买火车票的时候,如何能确定余票数据准确而无误差,这个时候就需要 ...
最新文章
- php html 变量,PHP与HTML混编,使用PHP变量代替数据--20190221
- USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)
- 《软件工程》 教 学 大 纲
- 整合框架过程记录日志
- Jmeter基本概念介绍
- Win7搭建Django开发环境
- 魅族魅蓝note6救砖及高通救砖工具分享
- 微信小程序项目2(哔哩哔哩)
- 【Kali】kali主要工具使用说明(文末附超全思维导图)
- 永洪BI强制显示移动端布局
- tif怎么转换成jpg格式
- python制作qq机器人_使用python打造一个自己的QQ机器人 【基础篇】
- String s1 = new String(abc)到底创建了几个对象?底层原理是什么?
- 聊聊HotSpot VM的Native Memory Tracking
- wordpress之邮箱插件的配置
- iOS程序员面试笔试宝典整理
- PS动作快速把图片做成手绘油漆涂鸦画效果
- html中的 语言设置
- 1026: 字符类型判断 C语言
- 第七次前端培训(JavaScript)