Java语言-59:使用同步代码块解决多线程安全问题

1、线程安全问题:

1)为什么会出现安全问题?
因为程序在运行时,会出现一个线程在判断条件满足后,具备了执行资格,但没有运行代码
后一个线程也判断了条件,也具备了执行资格,后一个线程运行了代码,但这时候,线程运行的条件不满足了

这时候,就出现了安全问题

2)问题的原因?
  当多条语句在操作同一线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完
  另一个线程参与进来,导致共享数据错误
  
3)解决办法
  对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其它线程不参与执行。
  
Java对于多线程的安全问题提供了专业的解决方式
就是同步代码块

2、同步代码块:在代码块前加上 synchronized关键字,则此代码块就成为同步代码块。

                        同步代码块的格式:

                                synchronized(同步对象){        //对象可以随意

                                    需要同步的代码;

                                        }

                同步对象一般为当前对象,即使用this关键字

对象如同锁,持有锁的线程可以在同步中执行

没有持有锁的线程即便获取cpu的执行权,也进不去,因为没有获取权

同步的前提:
1)必须要有两个或者两个以上
2)必须是多个线程使用同一个锁

必须保证同步中只能有一个线程在运行

好处:解决了多线程的安全问题

弊端:多个线程需要判断锁,较为消耗资源

3、代码举例:

                class Ticket implements Runnable 
{
    object obj=new object();
    private static int tick=100;
    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--);
                }
            }
          }
    }
}

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

猜你喜欢

转载自blog.csdn.net/qq_41833394/article/details/80490439