Java的同步代码块和同步方法

一 点睛

所谓原子性:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况。言外之意是这段代码就像原子一样,不可拆分。

同步的含义:多线程在代码执行的关键点上,互通消息,相互协作,共同把任务正确的完成。

同步代码块语法:

synchronized(对象)
{
    需要同步的代码块;
}

同步方法语法:

访问控制符 synchronized 返回值类型方法名称(参数)
{
    需要同步的代码;
}

二 同步代码块完成卖票功能

1 代码

public class threadSynchronization
{
    public static void main( String[] args )
    {
        TestThread t = new TestThread();
        // 启动了四个线程,实现资源共享
        new Thread( t ).start();
        new Thread( t ).start();
        new Thread( t ).start();
        new Thread( t ).start();
    }
}
class TestThread implements Runnable
{
    private int tickets = 5;
    @Override
    public void run()
    {
        while( true )
        {
            synchronized( this )
            {
                if( tickets <= 0 )
                    break;

                try
                {
                    Thread.sleep( 100 );
                }
                catch( Exception e )
                {
                    e.printStackTrace();
                }
                System.out.println( Thread.currentThread().getName() + "出售票" + tickets );
                tickets -= 1;

            }
        }
    }
}

2 运行

Thread-0出售票5
Thread-3出售票4
Thread-3出售票3
Thread-2出售票2
Thread-2出售票1

三 同步方法完成买票功能

1 代码

public class threadSynchronization
{
   public static void main( String[] args )
   {
      TestThread t = new TestThread();
      // 启动了四个线程,实现资源共享的目的
      new Thread( t ).start();
      new Thread( t ).start();
      new Thread( t ).start();
      new Thread( t ).start();
   }
}
class TestThread implements Runnable
{
   private int tickets = 5;

   public void run()
   {
      while( tickets > 0 )
      {
         sale();
      }
   }
   public synchronized void sale()
   {
      if( tickets > 0 )
      {
         try
         {
            Thread.sleep( 100 );
         }
         catch( Exception e )
         {
            e.printStackTrace();
         }
         System.out.println( Thread.currentThread().getName() + "出售票"
               + tickets );
         tickets -= 1;
      }
   }
}

2 运行

Thread-0出售票5
Thread-0出售票4
Thread-3出售票3
Thread-2出售票2
Thread-1出售票1

 

上一篇:Python之matplotlib之柱状图学习笔记汇总


下一篇:Java多线程详解