为何要使用同步?

java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时, 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调从而保证了该变量的唯一性和准确性。

解决线程同步的方案

同步方法

即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。

注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类

同步代码块

即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步

注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可

使用特殊域变量(volatile)实现线程同步

a.volatile关键字为域变量的访问提供了一
种免锁机制
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量

注:多线程中的非同步问题主要出现在对域的读写上,如果让域自身避免这个问题,则就不需要修改操作该域的方法。

用final域,有锁保护的域和volatile域可以避免非同步的问题。

使用重入锁实现线程同步

在JDK 1.5中新增了一个java.util.concurrent包来支持同步。
其中,ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力
ReenreantLock类的常用方法有:
ReentrantLock() : 创建一个ReentrantLock实例
lock() : 获得锁
unlock() : 释放锁

使用局部变量实现线程同步

如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响

ThreadLocal 类的常用方法
ThreadLocal() : 创建一个线程本地变量
get() : 返回此线程局部变量的当前线程副本中的值
initialValue() : 返回此线程局部变量的当前线程的"初始值"
set(T value) : 将此线程局部变量的当前线程副本中的值设置为value

注:ThreadLocal与同步机制
a.ThreadLocal与同步机制都是为了解决多线程中相同变量的访问冲突问题。
b.前者采用以"空间换时间"的方法,后者采用以"时间换空间"的方式

你还想让我怎样-线程同步(理论篇)相关推荐

  1. 多个线程访问统一对象的不同方法_不会多线程还想进BAT?精选19道多线程面试题,有答案边看边学...

    一. Java程序如何停止一个线程? 建议使用"异常法"来终止线程的继续运行.在想要被中断执行的线程中, 调用 interrupted()方法,该方法用来检验当前线程是否已经被中断 ...

  2. cpython gil_什么是GIL?为什么有了GIL还需要线程同步?为什么CPython设计了GIL?

    2019的暑假又准备用Python做个小项目,由于项目涉及高并发特性需要了解一下Python里的多线程与多进程,难免就会了解到CPython里的GIL(Global Interpreter Lock, ...

  3. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  4. Java高级-线程同步机制实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...

  5. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  6. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  7. Java线程同步机制synchronized关键字的理解

    由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: ...

  8. Java的知识点31——线程同步

    线程同步--并发控制 并发:同一个对象多个线程同时操作 线程不安全: 数据有负数.相同 开辟多线程,每个线程都有自己的工作空间  与 主存 进行交互 /*** 线程不安全: 数据有负数.相同* @au ...

  9. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

最新文章

  1. 在Tomcat配置JNDI数据源的三种方式
  2. 简单的hibernate环境搭建、自动生成model/配置/hibernate.xml配置文件
  3. android4.0支持m3u8格式,【报Bug】安卓下无法播放M3U8格式音频,报错
  4. [iOS]深度遍历view的subview
  5. 落户北京经开区 小米汽车首车预计2024年下线并量产 网友:开始存钱!
  6. java反射 获取属性_Java反射学习-3 - 反射获取属性,方法,构造器
  7. c判断数组是否为空_剑指offer编程题 1.二维数组中的查找
  8. import/export win7中电源计划
  9. 百度地图 城市中心点坐标
  10. 项目中常见的沟通方式
  11. QQ/微信 聊天表情显示原理
  12. android 亮度调节 接口,Android亮度调节的几种实现方法
  13. pyraformer: low-complexity pyramidal attention for long-range time series modeling and forecasting
  14. 南华大学计算机学院龚向坚,李跃-计算机科学与技术学院
  15. IDEA的ultimate(最终版)与community(社区版)的区别?
  16. 1265:最长公共子序列
  17. reduce()的基本用法
  18. MQTT协议图解,一文看懂MQTT协议数据包(真实报文数据解析解释)
  19. Android 用adb pull或push 拷贝手机文件到到电脑上
  20. android防止按钮多次点击,android button禁止连续点击

热门文章

  1. Tomcat主配置-应用部署
  2. Kubernetes 1.9集群使用traefik发布服务
  3. urllib的实现---请求响应and请求头处理
  4. AC日记——Count on a tree bzoj 2588
  5. ORACLE多条件的统计查询(case when)
  6. ecplise最有用的8个快捷键
  7. 如何在CentOS 7中配置静态IP地址
  8. Oracle11g修改实例名和数据库名
  9. 服务监控 Spring Boot Actuator 介绍
  10. DHCP分配IP地址详细流程讲解(附图,建议PC观看)