线程同步(synchronized)二十

来源:互联网 发布:知乎学生会主席 编辑:程序博客网 时间:2024/05/19 03:17
/**
 * 同步(并发),多个线程访问(同一份资源)+synchronized,加锁(线程安全)
 * 同步:1同步方法        2同步块  synchronized(引用类型|类.class|this)
 * @author Administrator
 *
 */
public class SynchronizedThr {
public static void main(String[] args) throws InterruptedException {
FiveThr fth=new FiveThr("马云"); //一份资源.在run()线程体替换 task()、task1()、task1();测试
//线程不安全,没同步task();同步方法task1(); 同步块task2();看看结果如何
Thread proxy=new Thread(fth,"黄牛甲");
Thread proxy1=new Thread(fth,"黄牛乙");
Thread proxy2=new Thread(fth,"黄牛丙");
Thread proxy3=new Thread(fth,"黄牛丁");
//==================================
proxy.start();
proxy1.start();
proxy2.start();
proxy3.start();

//就绪后,等待cpu调度分配时间片---运行

Thread.sleep(5000);//放票时间5秒

fth.stop();//线程终止,死亡
}
}
class FiveThr implements Runnable{
private int tickets=20;
private String name;
private boolean flag=true;

public FiveThr(String name) {
this.name = name;
}
@Override
public void run() {//线程体
while(flag){
try {
Thread.sleep(500);   //模拟延时时间,阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
task1();
}
}
private  void  task(){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+",帮"+this.name+",抢到第"+(tickets--)+"张票");
}
}
private synchronized void  task1(){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+",帮"+this.name+",抢到第"+(tickets--)+"张票");
}
}
private  void  task2(){
synchronized(this){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+",帮"+this.name+",抢到第"+(tickets--)+"张票");
}
}
}
public void stop(){
flag=false;
}
}
原创粉丝点击