java关于并发模型中的两种锁知识点详解

1、悲观锁

悲观锁假设最坏的情况(如果果你不锁门,那么捣蛋鬼就会闯入并搞得一团糟),只有在确保其他线程不受干扰(获得正确的锁)的情况下才能执行。

一般实现如独占锁等。

安全性更高,但中低并发性效率更低。

2、乐观锁

乐观锁通过冲突检查机制判断更新过程中是否存在其他线程干扰。如果存在,操作将失败,重试(也可以不重试)。

CAS等常见实现。

一些乐观锁削弱了一致性,但在中低并发性下效率大大提高。

知识点扩展:

并行与分布式编程

关注的是复杂软件系统的构造,“复杂”是指多线程、分布式与GUI程序

在锁与同步这一节中,详细介绍了如何设计线程安全的ADT

并发

在我们的并发介绍中,我们看到了两种并发编程模型:共享内存和消息传递。

• 在共享内存模型中 :并发模块通过在内存中读取和写入共享可变对象来进行交互。在单个Java进程中创建多个线程是我们共享内存并发的主要示例。

• 在消息传递模型中:并发模块通过通信通道相互发送不可变消息进行交互。该通信通道可以通过网络连接不同的计算机,如我们的一些初始示例:Web浏览,即时消息等。

对于锁,这是Java语言提供的内嵌机制,每个Object都有相关联的lock;

首先来了解一下java锁的相关概念

Java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或者代码方法的时候会自动获得该锁,在退出同步代码块或者方法的时候则会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或者方法。

Java内置锁是一个互斥锁:就是最多一个程序能够得到这个锁。当多个线程想要对某个mutable类型的ADT操作时,就是修改它的值时,锁能够劫持这些线程的操作,阻塞他们,只有之前的线程结束调用时,释放这个锁,后面的线程才能获得该锁,否则一直等待下去。

用法

同步和锁:阻止了多线程在同一时间内对可变数据的共享操作,即程序员来负责多线程之间对mutable数据的共享操作,通过”同步”策略,避免多线程同时访问数据,使用锁机制,获取对数据的独家mutation权,其他线程被阻塞,不得访问,即不可修改。

Java同步锁实现方法

synchronized 关键词修饰

wait、notify、notifyAll的使用

(0)

相关推荐

  • Java基于redis实现分布式锁

    为了保证一个在高并发存场景下只能被同一个线程操作,java并发处理提供ReentrantLock或Synchronized进行互斥控制.但是这仅仅对单机环境有效.我们实现分布式锁大概通过三种方式. redis实现分布式锁 数据库实现分布式锁 zk实现分布式锁 实际上这三种和java对比看属于一类.都是属于程序外部锁. 原理剖析 上述三种分布式锁都是通过各自为依据对各个请求进行上锁,解锁从而控制放行还是拒绝.redis锁是基于其提供的setnx命令. setnx当且仅当key不存在.若给定key已

  • 浅谈Java由于不当的执行顺序导致的死锁

    我们来讨论一个经常存在的账户转账的问题.账户A要转账给账户B.为了保证在转账的过程中A和B不被其他的线程意外的操作,我们需要给A和B加锁,然后再进行转账操作, 我们看下转账的代码: public void transferMoneyDeadLock(Account from,Account to, int amount) throws InsufficientAmountException { synchronized (from){ synchronized (to){ transfer(fr

  • Java8新特性之线程安全日期类

    LocalDateTime Java8新特性之一,新增日期类. 在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate.LocalTime.LocalDateTime[java8新提供的类] Java8新的时间API的使用方式,包括创建.格式化.解析.计算.修改 可以使用Instant代替 Date,LocalDateTime代替 Calendar,DateTi

  • Java线程安全和锁Synchronized知识点详解

    一.进程与线程的概念 (1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程. 在未配置 OS 的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完后,才允许另一个程序执行:在多道程序环境下,则允许多个程序并发执行.程序的这两种执行方式间有着显著的不同.也正是程序并发执行时的这种特征,才导致了在操作系统中引入进程的概念. 自从在 20 世纪 60 年代人们提出了进程的概念后,在 OS 中一直都是以进程作为能拥有资源和独立运行的基本单位的.直到 20 世纪 8

  • 如何测试Java类的线程安全性

    这篇文章主要介绍了如何测试Java类的线程安全性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 线程安全性是Java等语言/平台中类的一个重要标准,在Java中,我们经常在线程之间共享对象.由于缺乏线程安全性而导致的问题很难调试,因为它们是偶发的,而且几乎不可能有目的地重现.如何测试对象以确保它们是线程安全的? 假如有一个内存书架 package com.mzc.common.thread; import java.util.Map; impo

  • java多线程创建及线程安全详解

    什么是线程 线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位.每个程序程序都至少有一个线程,也即是程序本身. 线程的状态 新建(New):创建后尚未启动的线程处于这种状态 运行(Runable):Runable包括了操作系统线程状态的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间. 等待(Wating):处于这种状态的线程不会被分配CPU执行时间.等待状态又分为无限期等待和有限期等待,处于无

  • java枚举是如何保证线程安全的

    前言 写在前面:Java SE5提供了一种新的类型-Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能.本文将深入分析枚举的源码,看一看枚举是怎么实现的,他是如何保证线程安全的,以及为什么用枚举实现的单例是最好的方式. 枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字,他并不是一个类,那么枚举是

  • 程序猿必须要掌握的多线程安全问题之锁策略详解

    一.常见的锁策略 1.1 乐观锁 乐观锁:乐观锁假设认为数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正 式对数据是否产生并发冲突进行检测,如果发现并发冲突了,则让返回用户错误的信息,让用户决定如 何去做.乐观锁的性能比较高. 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会 上锁,这样别人想拿这个数据就会阻塞直到它拿到锁. 悲观锁的问题:总是需要竞争锁,进而导致发生线程切换,挂起其他线程:所以性能不高. 乐观锁的问题:并不总是能处理

  • 详解Java中的悲观锁与乐观锁

    一.悲观锁 悲观锁顾名思义是从悲观的角度去思考问题,解决问题.它总是会假设当前情况是最坏的情况,在每次去拿数据的时候,都会认为数据会被别人改变,因此在每次进行拿数据操作的时候都会加锁,如此一来,如果此时有别人也来拿这个数据的时候就会阻塞知道它拿到锁.在Java中,Synchronized和ReentrantLock等独占锁的实现机制就是基于悲观锁思想.在数据库中也经常用到这种锁机制,如行锁,表锁,读写锁等,都是在操作之前先上锁,保证共享资源只能给一个操作(一个线程)使用. 由于悲观锁的频繁加锁,

  • Java synchronize线程安全测试

    线程的运行是与当前CPU的资源调度与时间片是有关系的,当一个线程中的执行到某一部分方法的时候轮到另外一个线程来执行相应的代码,所以还没有等到第一个线程执行完那么CPU有切换到另外一个线程来运行其相应的代码,所以这个时候假如操作公共的数据部分就会出现错误 为了解决这个问题,可以使用 synchronized 同步代码块来对公共部分进行同步操作 在用synchronize关键字修饰同步代码块时,运行代码发现不能交替卖票. 以下是初始代码 package com.itheima.Test; publi

随机推荐