Lock是一个提供了锁获取的操作接口,实现的类有ReentrantLock和ReadLock,WriteLock。
先看一个例子,在count类的两个方法中分别用两个锁
package com.cwj.test410;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo {
public static void main(String[] args) {
TempCount count = new TempCount();
for (int i = 0; i < 3; i++) {
new Thread(){
@Override
public void run() {
count.get();
}
}.start();
}
for (int i = 0; i < 3; i++) {
new Thread(){
@Override
public void run() {
count.put();
}
}.start();
}
}
}
class TempCount {
public void get() {
ReentrantLock lock = new ReentrantLock();
lock.lock();
System.out.println(Thread.currentThread().getName() + "get begin");
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "get end");
lock.unlock();
}
public void put() {
ReentrantLock lock = new ReentrantLock();
lock.lock();
System.out.println(Thread.currentThread().getName() + "put begin");
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "put end");
lock.unlock();
}
}
运行结果如下
Thread-3put begin
Thread-1get begin
Thread-5put begin
Thread-2get begin
Thread-4put begin
Thread-0get begin
Thread-3put end
Thread-4put end
Thread-0get end
Thread-5put end
Thread-1get end
Thread-2get end
修改代码,将两个方法公用一个锁
代码如下
package com.cwj.test410;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo {
public static void main(String[] args) {
TempCount count = new TempCount();
for (int i = 0; i < 3; i++) {
new Thread(){
@Override
public void run() {
count.get();
}
}.start();
}
for (int i = 0; i < 3; i++) {
new Thread(){
@Override
public void run() {
count.put();
}
}.start();
}
}
}
class TempCount {
ReentrantLock lock = new ReentrantLock();
public void get() {
lock.lock();
System.out.println(Thread.currentThread().getName() + "get begin");
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "get end");
lock.unlock();
}
public void put() {
lock.lock();
System.out.println(Thread.currentThread().getName() + "put begin");
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "put end");
lock.unlock();
}
}
运行结果如下
Thread-0get begin
Thread-0get end
Thread-1get begin
Thread-1get end
Thread-2get begin
Thread-2get end
Thread-3put begin
Thread-3put end
Thread-4put begin
Thread-4put end
Thread-5put begin
Thread-5put end