对比:
- lock是显式锁(就是手动开锁,手动关锁),synchronized是隐式的,出了作用于自动释放锁
- Lock只有代码块锁,synchsynaronized有代码块锁还有方法锁
- Lock锁,jvm会使用更少的时间调度线程,性能更好,提供了很多子类,拓展性好
- 优先顺序:Lock>同步代码块>同步方法
1.Lock的使用
建议写finally释放锁,就像IO流关闭一样,
public class TestThread4 implements Runnable{
//票
private int ticketNum=10;
private final ReentrantLock lock=new ReentrantLock();//可重入锁
@Override
public void run() {
try {
lock.lock();
while(true){
if(ticketNum<=0){
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"---拿到了票:"+ticketNum--);
}
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
TestThread4 testThread4=new TestThread4();
//可用共同资源
new Thread(testThread4,"张三").start();
new Thread(testThread4,"李四").start();
new Thread(testThread4,"王五").start();
}
}
2.synchsynaronized的使用,换了TestThread4里的代码
public class TestThread4 implements Runnable{
//票
private int ticketNum=10;
Object obj = new Object();
@Override
public void run() {
synchronized (obj){
while(true){
if(ticketNum<=0){
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"---拿到了票:"+ticketNum--);
}
}
}