1 . 不要在run 方法上面添加synchronized
2 . 同步方法 锁是 this 还要要求 锁是 唯一的 , 同步方法要写在资源类里面
3 . 注意处理下面的run方法和saleTicket()方法的关系
4 .
package com.qf.demo;
public class Test3 {
public static void main(String[] args) {
Window2 window2 = new Window2();
Thread thread = new Thread(window2,"马什么梅");
Thread thread2 = new Thread(window2,"什么冬梅");
Thread thread3= new Thread(window2,"马东什么");
Thread thread4 = new Thread(window2,"马冬梅啊");
thread.start();
thread2.start();
thread3.start();
thread4.start();
}
}
/**
* 同步方法
*
* @author Administrator
*
*/
class Window2 implements Runnable {
int ticket = 100;
public void run() {// 不要在run 方法上面添加synchronized
while (true) {
if(!saleTicket()){
break;
}
}
}
// 同步方法 锁是 this 还要要求 锁是 唯一的 , 同步方法要写在资源类里面
public synchronized boolean saleTicket(){
if (ticket > 0) {
ticket--;
try {
Thread.sleep(1000);// 会释放cpu , 但是没有释放锁资源
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖了1张票,还剩" + ticket);
return true;
} else{
return false;
}
}
}