我是线程世界的新手,我正在通过线程了解最新的 util 包可重入锁机制,我正在了解同步机制和新添加的锁机制之间的基本差异,正如文章中的这些差异..
ReentrantLock 和 synchronized 关键字之间的另一个显着区别是公平性。synchronized 关键字不支持公平。任何线程一旦释放就可以获取锁,不能指定偏好,另一方面可以通过指定公平属性使 ReentrantLock 公平,同时创建 ReentrantLock 的实例。公平属性为最长等待线程提供锁,以防发生争用。如果你能提供一个小程序来证明这一点 sp,我可以掌握更多
synchronized 和 ReentrantLock 之间的主要区别是能够以中断方式尝试锁定,并且具有超时。线程不需要无限阻塞,synchronized就是这种情况,如果你能提供一个小程序来证明这一点sp,我可以掌握更多
ReentrantLock 和 Java 中的 synchronized 关键字之间另一个值得注意的区别是,在等待 Lock 时可以中断 Thread。在 synchronized 关键字的情况下,线程可以无限期地阻塞等待锁定,并且无法控制。ReentrantLock 提供了一个叫做 的方法
lockInterruptibly()
,可以用来在线程等待锁的时候中断它。同样tryLock()
,如果在某个时间段内没有锁可用,可以使用 timeout 来超时。如果你能提供一个小程序来证明这一点 sp ,我可以掌握更多
伙计们,你能不能提供一个小程序来显示以上三点
我已经尝试过这个程序,请告知需要在其中进行哪些更改以证明以上 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