Java

Java16-2 多线程同步函数及区别

2018-11-06  本文已影响0人  第二套广播体操

多线程函数引用的锁为this

同步函数:函数上加同步修饰关键字
同步函数使用的锁:函数需要被对象调用,哪个对象不确定 就用this来表示
同步函数使用的锁就是this

  public synchronized   void run() {

                while (tacket>0)
                {
                    System.out.println("线程销售: "+Thread.currentThread().getName()+"销售票次: "+tacket);
                    tacket--;
                }

    }

静态多线程函数
static方法随着类加载,这时不一定有该类对象,但一定有该类的字节码对象
这个对象简单的表示为类名.class

即静态多线程函数的引用锁为字节码对象

class Tacket implements Runnable
{  private static int tacket=1000;
  boolean flog=true;
  Object object=new Object();

    @Override
    public void run() {
        if (flog) {
            synchronized (object) {
                 while (tacket > 0)
                   System.out.println(Thread.currentThread().getName() +"同步代码块"+ "剩余数" + tacket--);
            }
        }
        else{sale();}
    }
    public  static  synchronized void sale(){
        while (tacket > 0)
            System.out.println(Thread.currentThread().getName() +"同步方法"+ "剩余数" + tacket--);
    }
}

public class SaleTacket {
    public static void main(String[] args) throws InterruptedException {
        //线程任务对象
        Tacket tacket=new Tacket();
        Thread t1=new Thread(tacket,"线程1");
        Thread t2=new Thread(tacket,"线程2");
        t1.start();
        Thread.sleep(2);
        tacket.flog=false;
        t2.start();
    }
}

不同锁无法实现同步
结果:
线程2同步方法剩余数3
线程2同步方法剩余数2
线程2同步方法剩余数1
线程1同步代码块剩余数0

 synchronized (SaleTacket.class) {
                 while (tacket > 0)
                   System.out.println(Thread.currentThread().getName() +"同步代码块"+ "剩余数" + tacket--);
            }

和静态同步方法同锁

同步函数和同步代码块区别:

同步函数只能使用this锁
同步代码块可以使用任意对象锁
如果一个类中只需要一个锁,这时可以考虑同步函数,使用this,写法简单
如果一个类中需要多个锁,或者多个函数中需要用同一个锁,就使用同步代码块

上一篇下一篇

猜你喜欢

热点阅读