ReentrantLock类
ReentrantLock类可以实现和synchronized关键字一样的功能。
示例代码
package hello;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Service {
private Lock lock = new ReentrantLock();
public void testMethod() {
lock.lock();//加锁
System.out.println("ThreadName =" + Thread.currentThread().getName() +"----------------------------");
for (int i = 0; i < 5; i++) {
System.out.println("ThreadName =" + Thread.currentThread().getName() + (" " + (i + 1)));
}
lock.unlock();//释放锁
}
}
class MyThread extends Thread {
private Service service;
public MyThread(Service service) {
this.service = service;
}
@Override
public void run() {
this.service.testMethod();
}
}
public class Main {
public static void main(String[] args) {
Service service = new Service();
MyThread threada = new MyThread(service);
MyThread threadb = new MyThread(service);
MyThread threadc = new MyThread(service);
MyThread threadd = new MyThread(service);
MyThread threade = new MyThread(service);
threada.start();
threadb.start();
threadc.start();
threadd.start();
threade.start();
}
}
运行结果
ThreadName =Thread-0----------------------------
ThreadName =Thread-0 1
ThreadName =Thread-0 2
ThreadName =Thread-0 3
ThreadName =Thread-0 4
ThreadName =Thread-0 5
ThreadName =Thread-1----------------------------
ThreadName =Thread-1 1
ThreadName =Thread-1 2
ThreadName =Thread-1 3
ThreadName =Thread-1 4
ThreadName =Thread-1 5
ThreadName =Thread-2----------------------------
ThreadName =Thread-2 1
ThreadName =Thread-2 2
ThreadName =Thread-2 3
ThreadName =Thread-2 4
ThreadName =Thread-2 5
ThreadName =Thread-3----------------------------
ThreadName =Thread-3 1
ThreadName =Thread-3 2
ThreadName =Thread-3 3
ThreadName =Thread-3 4
ThreadName =Thread-3 5
ThreadName =Thread-4----------------------------
ThreadName =Thread-4 1
ThreadName =Thread-4 2
ThreadName =Thread-4 3
ThreadName =Thread-4 4
ThreadName =Thread-4 5
结果分析:
可以看到输出结果没有交替,证明此时各个线程对于lock.lock()和lock.unlock()之间的代码的执行是同步的。