「Javalock分类」java中lock的用法

博主:adminadmin 2023-03-18 15:16:12 736

本篇文章给大家谈谈Javalock分类,以及java中lock的用法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java中Lock和LockSupport的区别到底是什么

1、Java中的Lock是锁的接口,作用是提供锁特性,方法等操作行为的统一的描述。

2、Java中的LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。

其中LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。

java synchronized和lock的区别

两者区别:1.synchronized是java内置关键字,在jvm层面,Lock是java类;

2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;

3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;

4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;

5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平

6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

7.Lock是一个接口,synchronized是一个关键字,synchronized放弃锁只有两种情况:①线程执行完了同步代码块的内容②发生异常;而lock不同,它可以设定超时时间,也就是说他可以在获取锁时便设定超时时间,如果在你设定的时间内它还没有获取到锁,那么它会放弃获取锁然后响应放弃操作。

你明白了吗?

深入研究 Java Synchronize 和 Lock 的区别与用法

一、synchronized和lock的用法区别

synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。

lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。

二、synchronized和lock用途区别

synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候。

1.某个线程在等待一个锁的控制权的这段时间需要中断

2.需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程

3.具有公平锁功能,每个到来的线程都将排队等候

自旋锁和互斥锁的区别 java中lock Syntronized区别

自旋锁(Spin

lock)

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是

否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远

高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:

1、自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,如果不能在很短的时

间内获得锁,这无疑会使CPU效率降低。

2、在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如

copy_to_user()、copy_from_user()、kmalloc()等。

因此我们要慎重使用自旋锁,自旋锁只有在内核可抢占式或SMP的情况下才真正需要,在单CPU且不可抢占式的内核下,自旋锁的操作为空操作。自旋锁适用于锁使用者保持锁时间比较短的情况下。

两种锁的加锁原理

互斥锁:线程会从sleep(加锁)——running(解锁),过程中有上下文的切换,cpu的抢占,信号的发送等开销。

自旋锁:线程一直是running(加锁——解锁),死循环检测锁的标志位,机制不复杂。

互斥锁属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和

Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞

Java中Lock,tryLock,lockInterruptibly有什么区别

ReentrantLock锁有好几种,除了常用的lock,tryLock,其中有个lockInterruptibly。先把API粘贴上来lockpublicvoidlock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为1。如果当前线程已经保持该锁,则将保持计数加1,并且该方法立即返回。如果该锁被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态,此时锁保持计数被设置为1。指定者:接口Lock中的locklockInterruptiblypublicvoidlockInterruptibly()throwsInterruptedException1)如果当前线程未被中断,则获取锁。2)如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为1。3)如果当前线程已经保持此锁,则将保持计数加1,并且该方法立即返回。4)如果锁被另一个线程保持,则出于线程调度目的,禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态:1)锁由当前线程获得;或者2)其他某个线程中断当前线程。5)如果当前线程获得该锁,则将锁保持计数设置为1。如果当前线程:1)在进入此方法时已经设置了该线程的中断状态;或者2)在等待获取锁的同时被中断。则抛出InterruptedException,并且清除当前线程的已中断状态。6)在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁的普通获取或重入获取。指定者:接口Lock中的lockInterruptibly抛出:InterruptedException如果当前线程已中断。tryLockpublicbooleantryLock()仅在调用时锁未被另一个线程保持的情况下,才获取该锁。1)如果该锁没有被另一个线程保持,并且立即返回true值,则将锁的保持计数设置为1。即使已将此锁设置为使用公平排序策略,但是调用tryLock()仍将立即获取锁(如果有可用的),而不管其他线程当前是否正在等待该锁。在某些情况下,此“闯入”行为可能很有用,即使它会打破公平性也如此。如果希望遵守此锁的公平设置,则使用tryLock(0,TimeUnit.SECONDS),它几乎是等效的(也检测中断)。2)如果当前线程已经保持此锁,则将保持计数加1,该方法将返回true。3)如果锁被另一个线程保持,则此方法将立即返回false值。指定者:接口Lock中的tryLock返回:如果锁是自由的并且被当前线程获取,或者当前线程已经保持该锁,则返回true;否则返回false关于中断又是一段很长的叙述,先不谈。1)lock(),拿不到lock就不罢休,不然线程就一直block。比较无赖的做法。2)tryLock(),马上返回,拿到lock就返回true,不然返回false。比较潇洒的做法。带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false。比较聪明的做法。3)lockInterruptibly()就稍微难理解一些。先说说线程的打扰机制,每个线程都有一个打扰标志。这里分两种情况,1.线程在sleep或wait,join,此时如果别的进程调用此进程的interrupt()方法,此线程会被唤醒并被要求处理InterruptedException;(thread在做IO操作时也可能有类似行为,见javathreadapi)2.此线程在运行中,则不会收到提醒。但是此线程的“打扰标志”会被设置,可以通过isInterrupted()查看并作出处理。lockInterruptibly()和上面的第一种情况是一样的,线程在请求lock并被阻塞时,如果被interrupt,则“此线程会被唤醒并被要求处理InterruptedException”。并且如果线程已经被interrupt,再使用lockInterruptibly的时候,此线程也会被要求处理interruptedException先看lock()方法importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;/***@author作者E-mail:*@version创建时间:2015-10-23下午01:47:03类说明*/publicclassTestLock{//@Testpublicvoidtest()throwsException{finalLocklock=newReentrantLock();lock.lock();Threadt1=newThread(newRunnable(){@Overridepublicvoidrun(){lock.lock();System.out.println(Thread.currentThread().getName()+"interrupted.");}},"childthread-1");t1.start();Thread.sleep(1000);t1.interrupt();Thread.sleep();}publicstaticvoidmain(String[]args)throwsException{newTestLock().test();}}用eclipse对这个程序进行debug发现,即使子线程已经被打断,但是子线程仍然在run,可见lock()方法并不关心线程是否被打断,甚至说主线程已经运行完毕,子线程仍然在block().而使用LockInterupptibly,则会响应中断importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;/***@author作者E-mail:*@version创建时间:2015-10-23下午01:53:10类说明*/publicclassTestLockInterruptibly{//@Testpublicvoidtest3()throwsException{finalLocklock=newReentrantLock();lock.lock();Threadt1=newThread(newRunnable(){@Overridepublicvoidrun(){try{lock.lockInterruptibly();}catch(InterruptedExceptione){System.out.println(Thread.currentThread().getName()+"interrupted.");}}},"childthread-1");t1.start();Thread.sleep(1000);t1.interrupt();Thread.sleep();}publicstaticvoidmain(String[]args)throwsException{newTestLockInterruptibly().test3();}}try{Thread.sleep(2000);lock.lockInterruptibly();}catch(InterruptedExceptione){System.out.println(Thread.currentThread().getName()+"interrupted.");}t1.start();t1.interrupt();Thread.sleep();如果将代码改成这样,那么将会在在阻塞之前已经中断,此时再lockInterruptibly()也是会相应中断异常的

请问java中的lock和synchronized区别是什么?

lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁

synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

Javalock分类的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中lock的用法、Javalock分类的信息别忘了在本站进行查找喔。