目录
1.基本介绍
1.java语言里,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
2.每个对象都对应于一个可称为互斥锁的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
3.关键字synchronized来与对象的互斥锁联系,当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
4.同步的局限性:导致程序的执行效率要降低。
5.同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)。
6.同步方法(静态的)的锁是当前类本身。
2.代码实现:
1.非静态实现同步方法
(同步方法,非静态)把互斥锁放在对象上,而不是this上。
public class SellTicket {
public static void main(String[] args) {
Sellticket4 sellTicket03 = new Sellticket4();
new Thread(sellTicket03).start();
new Thread(sellTicket03).start();
new Thread(sellTicket03).start();
}
}
class Sellticket4 implements Runnable{
private int num=100;
private boolean loop=true;
Object obiect=new Object();
@Override
public void run() {
while (loop){
synchronized (object){
if (num<=0) {
System.out.println("售票结束。。。");
loop=false;
return;
}
//休眠50毫秒
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口 "+Thread.currentThread().getName()+" 售出一张票 "+"剩余票数="+(--num));
}
}
}
}
2..静态实现同步方法
(静态)
public synchronized static void m1(){
}
public static void m2(){
synchronized (Sellticket4.class){
System.out.println("m2");
}
}
ps:
1.同步方法如果没有使用static修饰,默认锁的对象为this。
2.如果方法使用static修饰,默认锁的对象:当前类。
3.实现的落地步骤:
- 需要先分析上锁的代码,
- 选择同步代码块或同步方法。
- 要求多个线程的锁对象为同一个。