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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李珍 注册黑马   /  2012-7-25 22:37  /  1111 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程的安全问题。


安全问题产生的原因:

1,多个线程在操作共享数据。
2,操作共享数据的代码有多条。
一个线程在执行多条操作共享数据的过程中,其他线程参数与了运算,这时就会发生安全问题。

想要分析是否安全问题:
依据:线程任务中有没有共享数据,该数据是否被多条语句操作啊。



解决方案:只要保证一个线程在执行多条操作共享数据的语句时,其他线程不能参与运算即可。
                当该线程都执行完后,其他线程才可以执行这些语句。

代码表现:java中给我们提供具体的解决语句。
                那就是同步代码块。
                格式:
                synchronized(对象)//对象可以是任意的对象。
                {
                        需要被同步的语句。
                }


同步的原理:其实就是将需要同步的代码进行封装,并在该代码上加了一个锁。

同步的好处:解决多线程的安全问题。

同步的弊端:会降低性能。

一种现象:出现了多线程安全问题,为了解决,加上同步,发现,问题依旧。
怎么办?

同步的前提:
        必须要保证在同步中有多个线程。因为同步中只有一个线程该同步是没有意义。
        必须要保证多个线程在同步中使用的是同一个锁。

        必须保证多个线程使用的锁是同一个。
        这时才成为多个线程被同步了。

*/

class Ticket implements Runnable
{
        private int num = 200;
        Object obj = new Object();
        public void run()
        {
                while(true)
                {
                        synchronized(obj)
                        {
                                if(num>0)
                                {
                                        try{Thread.sleep(10);}catch(InterruptedException e){}
                                        System.out.println(Thread.currentThread().getName()+".....sale....."+num--);
                                }
                        }
                }
        }
}

class ThreadSynDemo
{
        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);
                Thread t4 = new Thread(t);

                t1.start();
                t2.start();
                t3.start();
                t4.start();

        }
}

0 个回复

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