同步的两种实现方法
synchronized关键字有两种方式实现
- 同步代码块 : 利用synchronized包装的代码块,但是需要指定同步对象,一般设置为this
- 同步方法 : 利用synchronized定义的方法
public class Test extends Object {
public static void main(String[] args) throws Exception {
Runnable myThread = new MyThread();
Thread thread0 = new Thread(myThread);
Thread thread1 = new Thread(myThread);
Thread thread2 = new Thread(myThread);
Thread thread3 = new Thread(myThread);
Thread thread4 = new Thread(myThread);
thread0.start();
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
//同步代码块
class MyThread implements Runnable {
private int ticket = 5;
@Override
public void run() {
for (int i = 0; i < 50; i++) {
synchronized(this){
if (this.ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.ticket--;
System.out.println(Thread.currentThread().getName() + "余票:" + this.ticket);
}
}
}
}
}
//同步方法
class MyThread implements Runnable {
private int ticket = 5;
@Override
public void run() {
for (int i = 0; i < 50; i++) {
this.sale();
}
}
public synchronized void sale(){
if (this.ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.ticket--;
System.out.println(Thread.currentThread().getName() + "余票:" + this.ticket);
}
}
}
锁的类型
根据sunchronized关键字修饰的位置不同,锁也不同。除了代码块和方法上的差异,还有静态非静态的差异。
本质上都是对象锁;差异在锁的对象是不一样的。
非静态锁的是调用该方法的实例对象,静态锁的是 类.Class对象