大家好,今天小编关注到一个比较有意思的话题,就是关于java语言Lock的问题,于是小编就整理了3个相关介绍Java语言Lock的解答,让我们一起看看吧。
j***a中Lock和synchronize混合使用锁住对象时,为何不能保证数据安全?
j***a中内置锁synchronized和显式锁Lock在实现上完全不同,两者没有混合使用的办法,不能保证数据安全。
我们都知道,j***a的synchronized机制,有一个锁对象,在这个锁对象上实现互斥的操作。默认的情况下,会使用当前对象或类实例作为锁对象。我们也可以使用一个相同的锁对象,对不同类的方法或代码块进行保护。
但是,Lock与synchronized的实现方式完全不同,Lock中并不像synchronized中存在互斥的锁对象,而是使用了一个状态计数器,并在尝试获取锁时,使用乐观锁机制,调用CAS操作来重复尝试获取锁。
所以,当我们混合使用synchronized和Lock时,实际上就是使用了两把完全不同的锁,相互没有任何关系。
Lock和synchronized该如何选择?
• ReentrantLock 和SynchronizedReentrantLock拥有Synchronized相同的并发性和内存语义,此外还多了锁投票,定 时锁等候和中断锁等候线程A和B都要获取对象0的锁定,***设A获取了对象0锁,B将等待A释放对0的锁定, 如果使用synchronized,如果A不释放,B将一直等下去,不能被中断如果使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断 等待,而干别的事情• ReentrantLockReentrantLock获取锁定与三种方式:a) lock(),如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状 态,直到获取锁b) tryLock(),如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;c) tryLock(long timeout,TimeUnit unit),如果获取了锁定立即返回true,如果别的线 程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回 true,如果等待超时,返回false;d) locklnterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠 状态,直到或者锁定,或者当前线程被别的线程中断・区别。synchronized:在***竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合 适的。原因在于,编译程序通常会尽可能的进行优化synchronized,另外可读性 非常好,不管用没用过5.0多线程包的程序员都能理解。o ReentrantLock:ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的 同步(synchronized的同步是不能Interrupt的)等。在***竞争不激烈的情形 下,性能稍微比synchronized差点点。但是当同步非常激烈的时候, synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。
锁是怎么封装的?
锁的封装通常是为了提供一种安全的方式来控制对共享***的访问,避免并发操作导致的数据不一致问题。
在.NET中,可以使用Monitor、Mutex、Semaphore等机制来实现锁。
在J***a中,可以使用synchronized或者ReentrantLock等类来实现锁。
在Python中,可以使用threading模块中的Lock类来实现锁。
在Go语言中,可以使用sync包中的Mutex类型来实现锁。
到此,以上就是小编对于j***a语言Lock的问题就介绍到这了,希望介绍关于j***a语言Lock的3点解答对大家有用。