经典卖票例子
package com.cskaoyan.a;
public class Test3 {
public static void main(String[] args) {
SellTicket sTicket = new SellTicket();
Thread t1 = new Thread(sTicket);
Thread t2 = new Thread(sTicket);
Thread t3 = new Thread(sTicket);
t1.start();
t2.start();
t3.start();
}
}
class SellTicket implements Runnable{
int tickets=100;
@Override
public void run() {
while (true&&tickets>0) {
System.out.println(Thread.currentThread().getName()+"卖出了一张,剩余"+(--tickets));
}
}
}
- 上述代码出现安全问题,解决如下
while(true){
//线程共享数据,保证安全,加入同步代码块
synchronized(obj){
//对票数判断,大于0,可以出售,变量--操作
if( ticket > 0){
try{
Thread.sleep(10);
}catch(Exception ex){}
System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
}
}
}
- synchronized方法
关于synchronized方法的同步锁,使用this。因为实现implent接口,多线程共享一个对象的资源,this指向每次执行方法的对象的引用,而这里那个对象只有一个
public synchronized void payTicket(){
if( ticket > 0){
try{
Thread.sleep(10);
}catch(Exception ex){}
System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
}
}
- 静态synchronized方法
静态synchronized方法中的同步锁对象就不能是this了。因为this是对象的引用,在static中那个方法属于类,因此那个所对象是那个类的字节码文件