同步锁
同步:体现了排队的效果,同一时刻只能有一个线程独占资源,其他没有权利的线程排队。
缺点:效率降低,但是保证了安全。
异步:体现了多线程抢占资源的效果,线程间互相不等待,互相抢占资源。
缺点:有安全隐患,效率要高一些。
synchronized关键字
synchronized (锁对象){
};
使用前提:单线程不需要考虑线程安全问题,多个线程间必须使用同一个锁。
synchronized同步关键字可以用来修饰代码块,称为同步代码块,使用的锁对象类型任意;
synchronized同步关键字可以用来修饰方法,称为同步方法
加锁代码
以售票为例
public class Runnable {
public static void main(String[] args) {
//创建目标业务类对象
Ticket target = new Ticket();
//创建线程对象
Thread t1 = new Thread(target);
Thread t2 = new Thread(target);
Thread t3 = new Thread(target);
Thread t4 = new Thread(target);
//以多线程的方式运行
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Ticket implements Runnable {
//定义成员变量,保存票数
int tickets = 200;
//创建锁对象
Object o = new Object();
//实现接口中未实现的方法
@Override
public void run() {
//4.通过循环结构完成业务
while (true) {
synchronized (o) {
if (tickets > 0) {
try {
Thread.sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "=" + tickets--);
}
if (tickets <= 0) break;
}
}
}
}