目录
一:Lock锁的使用(解决同步问题)
虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock由于Lock是接口所以接口多态。
Lock lock = new ReentrantLock();//接口多态
方法:
void lock() 加锁
void unlock()释放锁
注意要加try( lock)和finall(unlock)
二:例子
依旧与上一篇线程安全一样用卖票例子
package day33;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Thread1 implements Runnable {//自定义类实现 Runnable重写run方法
int tickets=100;
boolean b=true;
Lock lock= new ReentrantLock();//用接口多态创建锁对象
@Override
public void run() {
while(b)
try {//加锁
lock.lock();
if(tickets>0){
System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets--+"张票");
}
if(tickets<=0){
b=false;
}
}
finally {
lock.unlock();//释放锁
}
}
}
package day33;
public class SellTickets {
public static void main(String[] args) {
Thread1 thread1 = new Thread1();//创建继承Runnable接口类的对象
//创建三个线程
Thread w1 = new Thread(thread1, "窗口一");
Thread w2 = new Thread(thread1, "窗口二");
Thread w3 = new Thread(thread1, "窗口三");
//启动线程
w1.start();
w2.start();
w3.start();
}
}
三:同步的特点
(1)同步的前提
多个线程 多个线程使用的是同一个锁对象
(2)同步的好处
同步的出现解决了多线程的安全问题。
3)同步的弊端
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。