同步代码锁的对象
//A :同步代码块的锁对象是谁呢?
// 任意对象。
// B:同步方法的格式及锁对象问题?
// 把同步关键字加在方法上。
// 同步方法是谁呢?
// this
// C :静态方法及锁对象问题?
// 静态方法的锁对象是谁呢?
// 类的字节码文件对象。(反射会讲 )
package threadstudy_08;
//A :同步代码块的锁对象是谁呢?
// 任意对象。
// B:同步方法的格式及锁对象问题?
// 把同步关键字加在方法上。
// 同步方法是谁呢?
// this
// C :静态方法及锁对象问题?
// 静态方法的锁对象是谁呢?
// 类的字节码文件对象。(反射会讲 )
public class SellTicket implements Runnable {
// private int ticket = 100;
private static int ticket =100;
private Object obj = new Object();
int i=0;
@Override
public void run() {
while (true) {
if (i % 2 == 0) {
//synchronized (obj) {
//synchronized (this){
synchronized (SellTicket.class){
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在售出第" + ticket-- +
"票");
}
}
}
else{
//method();
//method1();//由此可以知道synchronized的类对象并不是obj而是this
}
i++;
}
}
// private void method(){
//
// synchronized (obj) {
//
// if (ticket > 0) {
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在售出第" + ticket-- +
// "票");
//
//
// }
//
// }
//
// }
//private synchronized void method1(){
//
//
//
// if (ticket > 0) {
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在售出第" + ticket-- +
// "票");
//
//
//
//
// }
//
// }
private static synchronized void method2(){
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在售出第" + ticket-- +
"票");
}
}
}
package threadstudy_08;
//
//A :同步代码块的锁对象是谁呢?
// 任意对象。
// B:同步方法的格式及锁对象问题?
// 把同步关键字加在方法上。
// 同步方法是谁呢?
// this
// C :静态方法及锁对象问题?
// 静态方法的锁对象是谁呢?
// 类的字节码文件对象。(反射会讲 )
public class SellTickerDemo {
public static void main(String[] args) {
SellTicket st=new SellTicket();
Thread t1=new Thread(st,"第1个售票窗口");
Thread t2=new Thread(st,"第2个售票窗口");
Thread t3=new Thread(st,"第3个售票窗口");
t1.start();
t2.start();
t3.start();
}
}