美文网首页Java
Java16-2 多线程同步函数及区别

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

作者: 第二套广播体操 | 来源:发表于2018-11-06 22:24 被阅读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,写法简单
    如果一个类中需要多个锁,或者多个函数中需要用同一个锁,就使用同步代码块

    相关文章

      网友评论

        本文标题:Java16-2 多线程同步函数及区别

        本文链接:https://www.haomeiwen.com/subject/vzdpxqtx.html