Synchronized与Lock

栏目: Java · 发布时间: 6年前

内容简介:单线程执行指令不会出现问题,多线程情况下,当访问一个共享资源,如一个变量、一个对象等统称为临界资源,因为线程执行的不可控,所以导致可能出现线程安全问题。采用序列化访问临界资源的方式,即在同一时刻,只能有一个线程访问临界资源。通常来说就是在临界资源上加锁,Java中提供了两个同步互斥的方法synchronized和lock。Java中的每一个对象中都有一个monitor内部锁,synchronize的原理就是通过获取对象的内部锁实现同步互斥,使用monitorenter、monitorexit指令对对象锁计数

为什么存在线程安全问题

单线程执行指令不会出现问题,多线程情况下,当访问一个共享资源,如一个变量、一个对象等统称为临界资源,因为线程执行的不可控,所以导致可能出现线程安全问题。

如何解决问题

采用序列化访问临界资源的方式,即在同一时刻,只能有一个线程访问临界资源。通常来说就是在临界资源上加锁,Java中提供了两个同步互斥的方法synchronized和lock。

Synchronized

Java中的每一个对象中都有一个monitor内部锁,synchronize的原理就是通过获取对象的内部锁实现同步互斥,使用monitorenter、monitorexit指令对对象锁计数操作加减1,当一个线程拿到锁后,其他线程阻塞,等待线程释放锁,阻塞过程是不能被中断的。

注意:

  1. 当一个线程访问一个对象中的synchronized方法时,其他线程不能访问该对象中任何synchronized方法,非synchronized方法可以,因为一个对象只有一把锁
  2. 类其实也有一把锁,用于控制对static成员变量的访问,与对象锁互不干扰

Synchronized与Lock

Synchronized与Lock

Synchronized与Lock

当执行synchronized代码块或方法时,出现异常时,jvm会释放当前线程的锁,因此不会出现死锁的情况复制代码

synchronized的缺陷

  1. 等待中的线程不能被中断
  2. 获取锁有没有成功无法获知
  3. 当多个线程只是进行读操作时,可以实现线程不冲突

Lock

Java中另外一个实现锁的接口

由于lock不能实现自动释放锁,所以需要手动释放,容易造成死锁,特别注意复制代码

主要方法包括:

  1. lock()--获取锁,如果其他线程已经获取锁则等待,不可中断
  2. unlock()--解锁
  3. trylock()--获取锁,成功获取返回true,否则不等待直接返回false
  4. trylock(long time, TimeUnit unit)--在3的基础上,如果未获取锁则等待time时间,在此期间如果获取到锁则返回true,否则false
  5. lockInteruptly()--获取锁,如果其他线程已经获取锁则等待,可以中断

ReentrantLock--可重入锁

ReadWriteLock--读写锁

Synchronized与Lock

lock与synchronize的区别

  1. lock是接口,synchronized是 Java 关键字
  2. synchronized可以自动释放锁(执行完毕或异常),lock需要手动释放
  3. synchronized等待中的线程不可中断,lock可以
  4. lock可以提高多线程读的效率
  5. lock可以得到获取锁的结构

锁概念

  • 可重入锁

表示线程可以重复获取已经获得的锁。从可重入锁可以看出,锁的分配机制,是根据线程分配而不是根据方法分配,比如线程1获取到一个对象的锁,对象中包含两个synchronized修饰的方法,方法A中调用方法B,当线程执行A时无需再获取一次锁,否则将进入死循环

  • 可中断锁
lock.lockInteruptly()复制代码
  • 公平锁

公平锁表示尽量按照请求锁的先后顺序分配锁,即一个线程释放锁后,由等待时间最长的线程获取锁,在初始化 ReentrantLock时

Lock lock = new ReentrantLock(true); 表示使用公平锁,默认为false

  • 读写锁
ReentrantReadWriteLock复制代码

以上所述就是小编给大家介绍的《Synchronized与Lock》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Git

Pro Git

Scott Chacon / Apress / 2009-8-27 / USD 34.99

Git is the version control system developed by Linus Torvalds for Linux kernel development. It took the open source world by storm since its inception in 2005, and is used by small development shops a......一起来看看 《Pro Git》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具