同步的两种实现方法
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;@Overridepublic 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;@Overridepublic 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对象

