synchronized和lock
synchronized: 自动的获取和释放锁
synchronized(new Object()) {
...
}
lock:手动的获取和释放锁
Lock lock = new ReentrantLock();
lock.lock();
try {
...
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
lock实例
class Source {
int count = 0;
boolean flag = false;
Lock lock = new ReentrantLock(); // 线程锁
Condition condition = lock.newCondition(); // 线程通讯
}
class Producer extends Thread {
private Source source;
public Producer(Source source) {
this.source = source;
}
@Override
public void run() {
while (true) {
source.lock.lock(); // 上锁,最好不要把获取锁的过程写在try语句块中
try {
if(!source.flag) {
source.count++;
source.flag = true;
System.out.println("生产资源:"+source.count);
source.condition.signal(); // 唤醒另一个线程
} else {
source.condition.await(); // 当前线程等待
}
} catch (Exception e) {
e.printStackTrace();
} finally {
source.lock.unlock(); // 释放锁
}
}
}
}
class Consumer extends Thread {
private Source source;
public Consumer(Source source) {
this.source = source;
}
@Override
public void run() {
while (true) {
source.lock.lock(); // 上锁,最好不要把获取锁的过程写在try语句块中
try {
if(source.flag) {
System.out.println("消费资源:"+source.count);
source.flag = false;
source.condition.signal(); // 唤醒另一个线程
} else {
source.condition.await(); // 当前线程等待
}
} catch (Exception e) {
e.printStackTrace();
} finally {
source.lock.unlock(); // 释放锁
}
}
}
}
public class LockDemo {
public static void main(String[] args) {
Source source = new Source();
Producer producer = new Producer(source);
Consumer consumer = new Consumer(source);
producer.start();
consumer.start();
}
}