同步代码块解决线程创建方式的线程安全问题

  • Java使用线程的同步机制解决线程的安全问题
  • 方式一:同步代码块
    • synchronized 关键字可以用于某个区块前面,表示只对这个区块的资源实行互斥访问。
    • 格式为:
      synchronized(同步监视器){
      //需要被同步的代码
      }
    • 说明:
      • 需要被同步的代码,即为操作共享数据的代码。
      • 共享数据:即多个线程多需要操作的数据。
      • 需要被同步的代码,在被synchronized包裹以后,就使得一个线程在操作这些代码的过程中,其它线程必须等待。
      • 同步监视器,俗称锁。哪个线程获取了锁,哪个线程就能执行需要被同步的代码。可以使用任何一个类的对象充当。但是,多个线程必须共用同一个同步监视器。
      • 注意:
        • 在实现Runnable接口的方式中,同步监视器可以考虑使用:this。
        • 在继承Thread类的方式中,同步监视器要慎用this,可以考虑使用:当前类.class。
  • public class SynchronizedTest1 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		TicketSale1 t=new TicketSale1();
    		Thread t1=new Thread(t,"窗口1");
    		Thread t2=new Thread(t,"窗口2");
    		Thread t3=new Thread(t,"窗口3");
    		t1.start();
    		t2.start();
    		t3.start();
    	}
    
    }
    class TicketSale1 implements Runnable{
    	int ticket=100;
    	boolean isFlag=true;
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		while(isFlag) {
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			show();
    		}
    	}
    	public synchronized void show() {
    		if(ticket>0) {
    			System.out.println(Thread.currentThread().getName()+"--->售卖票"+ticket);
    			ticket--;
    		}else {
    			isFlag=false;
    		}
    	}
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值