你的位置:首页 > Java教程

[Java教程]Java多线程同步代码块


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

2.实现接口线程的方法不能抛出异常!

*/


/*运行情况
通过分析,发现,打印出0,-1,-2等错票。

多线程的运行出现了安全问题

问题的原因?
  当多条语句在操作同一线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完
  另一个线程参与进来,导致共享数据错误
 
解决办法
  对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其它线程不参与执行。
 
Java对于多线程的安全问题提供了专业的解决方式
就是同步代码块
格式:
    synchronized(对象)  对象可以随意(使用上帝就行)
    {
        需要被同步的代码(哪些代码在操作共享数据)
    }
    
对象如同锁,持有锁的线程可以在同步中执行
没有持有锁的线程即便获取cpu的执行权,也进不去,因为没有获取权

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

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

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

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


class Ticket implements Runnable //extends Thread
{
    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();
    }
}