Demo15_静态同步函数

package test06;

public class 静态同步函数 {

public static void main(String[] args) {
    ticket t = new ticket();
    Thread t1 = new Thread(t);
    Thread t2 = new Thread(t);
    t1.start();//开启时运行
    try{Thread.sleep(10);}catch(InterruptedException e){}
t.flag  = false  ;

    t2.start();
}

}
//static同步函数 使用的锁不是this 而是静态字节码文件对象 格式 类名.class
class ticket implements Runnable
{
public boolean flag = true ;
//1.定义票的总数量
static int tickets = 10 ;
@SuppressWarnings(“unused”)
private Object obj = new Object();
//2.售票的动作,这个动作会被多线程执行,那就是线程任务代码,需要定义在run方法中
@SuppressWarnings(“static-access”)
//线程任务中一般有循环结构
@Override
public void run() {
if(flag)
{
while(true)
{
synchronized (ticket.class) {
if(tickets>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();//处理方式
}
}
}
//this.sale();
//静态函数没有this 随着对象的加载而加载
}
}
else {
while(true){
this.sale();
}
}
}
public static synchronized void sale()//同步函数 所需要的同步代码
// 同步函数需要锁(函数的对象) 使用的对象时this
{
if( tickets > 0 )
{
//要让线程在这里等候,模拟问题的发生。 sleep 方法 出现 -1 -2 等错误数据,这就是多线程的安全问题
//静态方法直接 类名.方法 直接调用
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();//处理方式
}
System.out.println(Thread.currentThread().getName()+”……”+tickets–);//得知那张票是谁卖出的线程名字从Thread_0开始
}
}
}

猜你喜欢

转载自blog.csdn.net/mingxu_W/article/details/81669990