黑马程序员技术交流社区

标题: 多线程的安全问题 [打印本页]

作者: Good_Man    时间: 2015-11-30 14:36
标题: 多线程的安全问题
多线程的安全问题:
        当多条语句在操作一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,
        另一个线程参与进来执行,导致共享数据的错误
        
        如:经典的买票问题:
   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执行权,也进不去,因为没有获得锁




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2