/**
* Description: xxxx
* Copyright (c) , 2016, Jansonxu
* This program is protected by copyright laws.
* Program Name:ThreadSafeDemo.java
* Date: 2016年1月25日
*
* @author 李阳
* @version : 1.0
*/
package Safe;
public class ThreadSafeDemo5 {
private int num=100;
class Seller extends Thread{
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
/**
*
*/
public Seller() {
// TODO Auto-generated constructor stub
}
public Seller(String name) {
super(name);
}
//若是 this 的话 ! 指的是当前类 也就是这个Seller 有4个所以 this 并不靠谱!!!
@Override
public void run() {
while(true){
// 如果 () 里边是 new String() 的话就不是同一把锁了
synchronized (String.class) {// 张学友拿到了 锁对象的一个 锁标记,此刻别的线程都老老实实等待着 等正处于执行状态的线程
//释放锁标记 当前正处于运行状态的线程 执行完 同步代码块 之后 就会释放锁标记,此时锁对象的锁标记 就有可能被别的线程抢到
// 谁抢到谁执行同步代码块里边的方法 抢锁 之前没锁 多个一起抢
if(num<=0){// 放在外边 也会存在 多个一起进入的情况 并不是只进一个 上边只一个进入 就不存在这种情况了
break;
}
System.out.println(Thread.currentThread().getName()+"在出售"+num--+"张票");
try {
//让当前线程睡眠片刻 使得别的线程 有机会执行
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
ThreadSafeDemo5 instance=new ThreadSafeDemo5();
Seller seller=instance.new Seller("json"); //查看字节码文件如果有的话 就会重用
Seller seller1=instance.new Seller("张学友");
Seller seller2=instance.new Seller("文章");
Seller seller3=instance.new Seller("陈友谅");
seller.start();
seller1.start();
seller2.start();
seller3.start();
}
}