java 锁

什么是线程安全?
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。代码本省封装了所有必要的正确性保障手段(互斥同步等),令调用者无需关心多线程的问题,更无需自己实现任何措施来保证多线程的正确调用。

如何来实现线程安全?
我们应用最多的就是互斥锁;
java的互斥锁的主要有synchronized,和JUC 中的lock两种;

加锁的原理是
对象上有一个是否加锁的标志位和锁计数器,一个线程访问了一个锁住的代码后,获取锁,这时候会修改加锁标志位为“已加锁”,锁计数器=1;同一个线程访问多个synchronized代码是不需要重复获取锁的,也就是说同一个线程是不会出现死锁的问题。只是 锁计数器 = 锁计数器+1;当锁计数器=0时,会释放该对象的锁。如果synchronized修饰的是一个静态方法或class,这种情况是类锁。而区别于前面的对象锁了。

synchronized 主要用来修饰方法,或代码块,在{}中的代码是需要获取锁以后才能访问的,
synchronized的加锁和锁的释放是有jvm管理的,不需要我们代码控制。

ReentrantLock的高级特性有那几个?

1、等待可中断,当持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,改为处理其他事情;

2、可以实现公平锁,公平锁指多个线程在等待同一个锁时,必须按照申请锁的顺序依次获得锁,synchronized是非公平锁,ReentrantLock默认也是非公平的,只不过可以通过构造函数来制定实现公平锁;

3、锁绑定多个条件,ReentrantLock对象可以同时绑定多个Condition对象,在synchronized中,锁对象的wait/notify/notifyall方法可以实现一个隐含的条件,如果要多一个条件关联的时候,就需要额外的增加一个锁;

关于锁的几个使用建议?

1、使用并发包中的类,并发包中的类大多数采用了lock-free等算法,减少了多线程情况下的资源的锁竞争,因此对于线程间的共享操作的资源而言,应尽量使用并发包中的类来实现;

2、尽可能少用锁,没必要用锁的地方就不要用了;

3、拆分锁,即把独占锁拆分为多把锁(这个不一定完全适用);

时间: 2025-01-20 08:16:06

java 锁的相关文章

synchronized java锁-synchronized java锁

问题描述 synchronized java锁 synchronized(xxxxx.class){ xxxx; } 跟 private static String aaaaaa = new String("aaaaaaa"); synchronized(aaaaaa){ xxxx; } 这两个有什么区别?

java锁的种类以及辨析(一):自旋锁

作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 1.自旋锁 自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区.如下 01 public class SpinLock { 02   03   private

Java锁的种类以及辨析(二):自旋锁的其他种类

作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 2.自旋锁的其他种类 上篇我们讲到了自旋锁,在自旋锁中 另有三种常见的锁形式:TicketLock ,CLHlock 和MCSlock Ticket锁主要解决的是访问顺序的问题,主要的问题是在多核cpu上

Java锁的种类以及辨析(四):可重入锁

作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 四.可重入锁: 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响

Java锁的种类以及辨析(三):阻塞锁

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 三.阻塞锁: 阻塞锁,与自旋锁不同,改变了线程的运行状态. 在JAVA环境中,线程Thread有如下几个状态: 1,新建状态 2,就绪状态 3,运行状态 4,阻塞状态 5,死亡状态 阻塞锁,可以说是让线程进入阻塞状态进

Java锁的种类以及辨析

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA中常见的锁以及其特性,为大家答疑解惑. 1.自旋锁 2.自旋锁的其他种类 3.阻塞锁 4.可重入锁 5.读写锁 6.互斥锁 7.悲观锁 8.乐观锁 9.公平锁 10.非公平锁 11.偏向锁 12.对象锁 13.线程锁 14.锁粗化 15.轻量级锁 16.锁消除

Java锁之阻塞锁介绍和代码实例_java

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 阻塞锁 阻塞锁,与自旋锁不同,改变了线程的运行状态. 在JAVA环境中,线程Thread有如下几个状态: 1,新建状态 2,就绪状态 3,运行状态 4,阻塞状态 5,死亡状态 阻塞锁,可以说是让线程进入阻塞状态进行等待

Java锁之可重入锁介绍_java

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 四.可重入锁: 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响. 在JAV

java锁

问题描述 各位大神谁能给个好答案,详细一点的?java有几种锁,没种锁的应用场景是什么? 解决方案 解决方案二:原生的JAVA只有一种锁.concurrent包里分为读锁和写锁.你也可以根据他的接口来实现自己的锁解决方案三:我想知道关于锁的种类,机制,应用场景都是什么,详细一点的.比如:读锁,写锁,悲观锁,乐观锁,对象锁什么的,全面一点的.