我是Threads世界的新手,我正在通过最新的util包重入锁机制的线程,我正在经历同步机制和新添加的锁机制之间的基础差异,如文章中的这些是差异..
ReentrantLock和synchronized关键字之间的另一个显着区别是公平性。 synchronized关键字不支持公平性。任何线程一旦释放就可以获得锁定,不能指定首选项,另一方面,您可以通过指定公平属性使ReentrantLock公平,同时创建ReentrantLock实例。在争用的情况下,公平属性提供对最长等待线程的锁定。如果你能提供一个证明这一点的小程序,我可以掌握更多
synchronized和ReentrantLock之间的主要区别是能够以可中断的方式尝试锁定,并且具有超时功能。线程不需要无限阻塞,这是同步的情况,如果你能提供一个小程序来证明这一点,我可以掌握更多
Java中ReentrantLock和synchronized关键字之间的另一个值得注意的区别是,在等待Lock时中断Thread的能力。在synchronized关键字的情况下,可以无限期地阻塞线程等待锁定,并且无法控制该线程。 ReentrantLock提供了一个名为lockInterruptibly()
的方法,可用于在等待锁定时中断线程。类似地,如果在某段时间内锁定不可用,则tryLock()
超时可用于超时。如果你能提供一个证明这一点的小程序,我可以掌握更多
伙计们,请你提供一个小程序,显示以上三点
我已经尝试过这个程序,请告知需要做哪些更改来证明以上3点..
public class ReentrantLockHowto {
private final ReentrantLock lock = new ReentrantLock();
private int count = 0;
//Locking using Lock and ReentrantLock
public int getCount() {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + " gets Count: " + count);
return count++;
} finally {
lock.unlock();
}
}
//Implicit locking using synchronized keyword
public int getCountTwo() {
return count++;
}
public static void main(String args[]) {
final ThreadTest counter = new ThreadTest();
Thread t1 = new Thread() {
@Override
public void run() {
while (counter.getCount() < 6) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace(); }
}
}
};
Thread t2 = new Thread() {
@Override
public void run() {
while (counter.getCount() < 6) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
};
t1.start();
t2.start();
}
}
输出:
Thread-0 gets Count: 0
Thread-1 gets Count: 1
Thread-1 gets Count: 2
Thread-0 gets Count: 3
Thread-1 gets Count: 4
Thread-0 gets Count: 5
Thread-0 gets Count: 6
Thread-1 gets Count: 7