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包得以实现的基石。

多线程:线程同步的几种方式相关推荐

  1. Java线程同步的几种方式

    Java线程同步的几种方式 1.使用synchronized关键字  它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性.  synchronized关键字的用法: ...

  2. 一心多用多线程-线程创建的三种方式

    第一次了解java线程机制,记录一下线程启动的三种方式. 1.通过继承Thread类调用一个线程 public class Thread1 extends Thread{@Overridepublic ...

  3. C++线程同步的四种方式(Windows)

    原文链接:  https://blog.csdn.net/s_lisheng/article/details/74278765 什么是鲜橙同步?为什么要进行线程同步? 在程序中使用多线程时,一般情况, ...

  4. 实现线程同步的几种方式

    在多线程中线程的执行顺序是依靠哪个线程先获得到CUP的执行权谁就先执行,虽然说可以通过线程的优先权进行设置,但是他只是获取CUP执行权的概率高点,但是也不一定必须先执行.在这种情况下如何保证线程按照一 ...

  5. Python 线程同步的三种方式

    我们使用多线程的目的通常是并发的运行单独的操作,但有时候也需要在两个或多个线程中同步操作.在Python中,线程同步有多种方式,包括Event.Condition和Barrier 方式一:Event ...

  6. Python线程同步的5种方式

    问题的引入 import threading total = 0def add():global totalfor i in range(1000000):total += 1def desc():g ...

  7. photon四种同步方式_【Linux】多线程同步的四种方式

    背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include #include#include#include#include#include us ...

  8. 15.线程同步的几种方法

    一.为什么需要线程同步 线程同步通常是出现在多线程环境下的问题,对于多个线程同时访问的共享内存中的变量,如果不进行保护,就会导致一些列数据出错问题.以下图为例: 假设线程A在第一次读取变量的值为10, ...

  9. 关于线程同步的几种方法

    java允许多线程,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突. 比方说,我们在买火车票的时候,如何能确定余票数据准确而无误差,这个时候就需要 ...

最新文章

  1. php html 变量,PHP与HTML混编,使用PHP变量代替数据--20190221
  2. USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)
  3. 《软件工程》 教 学 大 纲
  4. 整合框架过程记录日志
  5. Jmeter基本概念介绍
  6. Win7搭建Django开发环境
  7. 魅族魅蓝note6救砖及高通救砖工具分享
  8. 微信小程序项目2(哔哩哔哩)
  9. 【Kali】kali主要工具使用说明(文末附超全思维导图)
  10. 永洪BI强制显示移动端布局
  11. tif怎么转换成jpg格式
  12. python制作qq机器人_使用python打造一个自己的QQ机器人 【基础篇】
  13. String s1 = new String(abc)到底创建了几个对象?底层原理是什么?
  14. 聊聊HotSpot VM的Native Memory Tracking
  15. wordpress之邮箱插件的配置
  16. iOS程序员面试笔试宝典整理
  17. PS动作快速把图片做成手绘油漆涂鸦画效果
  18. html中的 语言设置
  19. 1026: 字符类型判断 C语言
  20. 第七次前端培训(JavaScript)

热门文章

  1. 第三课时:PowerDesigner15基本操作
  2. sql 删除用户失败
  3. OSPF邻接形成过程
  4. 数据恢复西藏之旅--硬盘也有高原反应
  5. linux查看文件夹目录大小
  6. PyCharm中批量查找及替换
  7. libev的使用——结合Socket编程
  8. 快速穷举TCP连接欺骗攻击-利用SYN Cookies
  9. python dlib学习(四):单目标跟踪
  10. CelebA数据集在Linux下解压