美文网首页
多线程共享数据问题

多线程共享数据问题

作者: jose_dl | 来源:发表于2017-08-13 08:42 被阅读0次

    经典卖票例子

    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中那个方法属于类,因此那个所对象是那个类的字节码文件

    相关文章

      网友评论

          本文标题:多线程共享数据问题

          本文链接:https://www.haomeiwen.com/subject/ixusrxtx.html