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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 信仰年轻 中级黑马   /  2015-9-22 03:53  /  240 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package 主要内容;
/*
* 通过分析,发现,打印出0,-1,-2等错票
* 多线程的运行出现了安全问题
*
* 问题的原因:
*         当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,
*         另一个线程参与进来。导致了共享数据的错误
*
* 解决办法:
*         对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行
*
* java对于多线程的安全问题提供了专业的解决方式
* 就是同步代码块
*         synchronized(对象)
*         {
*                 需要被同步的代码
*         }
* 对象如同锁。持有锁的线程可以在同步中执行
* 没有持有锁的线程即使获取了CPU的执行权,也进不去,因为没有获取锁
*
* 火车上的卫生间---经典
*
* 同步的前提:
* 1、必须要有两个或者两个以上的线程
* 2、必须是多个线程使用同一个锁
* 必须保证同步中只能有一个线程在运行
*
* 好处:解决了多线程的安全问题
* 弊端:多个线程需要判断锁,较为消耗资源,
*/
class Piao implements Runnable
{
        private int tick=100;
        Object obj=new Object();
        public void run()
        {
                while(true)
                {
                        synchronized(obj)
                        {                       
                                if(tick>0)
                                {                               
                                        try{Thread.sleep(10);}catch(Exception e){}
                                        System.out.println(Thread.currentThread().getName()+"...sale:"+tick--);                               
                                }
                        }                       
                }
        }
}
public class 多线程的安全问题
{
        public static void main(String[] args)        
        {               
                Piao t=new Piao();
                Thread t1=new Thread(t);
                Thread t2=new Thread(t);
                Thread t3=new Thread(t);
                Thread t4=new Thread(t);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}


0 个回复

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