A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Good_Man 中级黑马   /  2015-11-30 14:36  /  274 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程的安全问题:
        当多条语句在操作一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,
        另一个线程参与进来执行,导致共享数据的错误
        
        如:经典的买票问题:
   class Ticket implements Runnable{
            private int tick=100;
            public void run(){
                    System.out.println(Thread.currentThread().getName()++"----"+tick--);
            }
   }
   class Demo{
           public static void main(String[] args) {
                    Ticket t=new Ticket();
                    Thread t1=new Thread(t);
                    Thread t2=new Thread(t);
                    Thread t3=new Thread(t);
        }
   }
   
解决方法:
        对多条操作共享数据的语句,只能让一个线程都执行完,其他线程才可以参与,
        就是同步代码块
      synchronized(对象){
              需要被同步的代码
      }
改进后:
class Ticket implements Runnable{
    private int tick=100;
    Object obj=new Object();
    public void run(){
            while(true){
                    synchronized(obj){
                           
                            if(tick>0)
                                    System.out.println(Thread.currentThread().getName()++"----"+tick--);
                    }
                           
            }
    }
}
class Demo{
   public static void main(String[] args) {
            Ticket t=new Ticket();
            Thread t1=new Thread(t);
            Thread t2=new Thread(t);
            Thread t3=new Thread(t);
}
}

对象如同锁,持有锁的对象可以在线程中执行,
没有持有锁的线程即使获得了cpu执行权,也进不去,因为没有获得锁

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马