首页 > 代码库 > 黑马程序员-学习日记(多线程的安全)

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

 安全产生的原因:

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

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();    }}

出现了票数为-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.必须多个线程必须使用同一个锁。 必须保证同步中只能有一个线程在运行。

好处:

解决了线程的安全问题

弊端:

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

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