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

黑马程序员-学习日记(多线程的安全)

时间:2014-12-06 22:46:27      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   使用   sp   on   

 安全产生的原因:

当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完, 另一个线程参与进来执行。导致共享数据的错误。

class Mlpc implements Runnable
{
    private int ticket = 50;

    public void run() 
    {
        while(true)
        {
            if(ticket>0)
            {
                try
                {
                    Thread.sleep(20); //让线程进入冻结状态
                }
                catch (Exception e)
                {
                }
                System.out.println(Thread.currentThread()+"  "+ticket--);
            }
        }
    }
}
class mlpcDemo 
{
    public static void main(String[] args) 
    {
        Mlpc m = new Mlpc();
        Thread th0 = new Thread(m);
        Thread th1 = new Thread(m);
        Thread th2 = new Thread(m);
        Thread th3 = new Thread(m);

        th0.start();
        th1.start();
        th2.start();
        th3.start();
    }
}

bubuko.com,布布扣

出现了票数为-1和-2这样的结果。

 解决办法:

针对多条线程将会操作共享数据的那条语句,每次只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。

方式:

同步代码块:

class Mlpc implements Runnable
{
    private int ticket = 50;
    Object obj = new Object();
    public void run() 
    {
        while(true)
        {
            synchronized (obj)
            {
                if(ticket>0)
                {
                    try
                    {
                        Thread.sleep(20);
                    }
                    catch (Exception e)
                    {
                    }
                    System.out.println(Thread.currentThread()+"  "+ticket--);
                }
            }
        }
    }
}

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

同步的前提:

1.必须要有两个或者两个以上的线程 2.必须多个线程必须使用同一个锁。 必须保证同步中只能有一个线程在运行。

好处:

解决了线程的安全问题

弊端:

消耗了资源,多个线程需要判断锁。

黑马程序员-学习日记(多线程的安全)

标签:style   blog   http   io   ar   color   使用   sp   on   

原文地址:http://www.cnblogs.com/tozr/p/4148792.html

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