码迷,mamicode.com
首页 > 编程语言 > 详细

线程2

时间:2018-10-13 12:58:04      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:同步机制   进程   tac   name   int   ble   png   inter   其他   

一,线程的生命周期

技术分享图片

 

二,如何处理线程的安全问题:售票时重票,0号票 -1号票

  原因:一个线程再操作共享数据的时,未执行完,另外的线程参与进来,导致共享数据存在了安全问题。

  解决方法:java的同步机制:必须让一个线程操作共享数据完毕以后,其他进程才有机会参与共享数据

  • 方式一:同步代码块
 public void hhh(){
        synchronized("同步监视器") {
            //需要被同步的代码块
        }
    }
   
    class ticket implements Runnable{
         int ticket = 100;
        Object obj = new Object();
        @Override
        public void run() {
            while (true) {
                synchronized(obj) {
                    //这里obj也可以换成this 
                    if (ticket > 0) {
                        try {
                            sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName() + ":" + ticket--);
                    }
                }
            }
        }
    }
public void hhh(){
synchronized("同步监视器") {
//需要被同步的代码块
}
}

同步监视器:任何类的对象都可以充当,哪个线程获取此监视器,谁就执行大括号里被同步的代码,俗称:锁。

  要求:所有线程必须共用一把锁。否则无效。

  注意:在实现Runable接口的方式中,考虑同步的话可以使用this来充当锁,但是在继承中,慎用this

  • 方式二:同步方法
 class ticket implements Runnable{
         int ticket = 100;
        Object obj = new Object();
        @Override
        public void run() {
            while (true) {
//                synchronized(obj) {
                    //这里obj也可以换成this 
                    show();
//                }
            }
        }
       public synchronized void show(){
            if (ticket > 0) {
                try {
                    sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ":" + ticket--);
            }
        }
    }

    

将操作共享数据的方法声明为synchronized。即此方法为同步方法,能够保证当中一个线程执行此方法时,其他线程在外等待直至此线程执行完此方法。

--> 同步方法的 锁 :this。所以同步方法的多线程的实现一般用实现Runable接口的方式。

 

线程2

标签:同步机制   进程   tac   name   int   ble   png   inter   其他   

原文地址:https://www.cnblogs.com/wsjun/p/9782433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!