synchronized关键字加到static静态方法和非static静态方法区别

synchronized关键字加到static静态方法上是给Class类上锁,简称类锁(锁的事当前类的字节码)
而加到非static静态方法是给对象加锁
为了验证不是同一个锁 验证代码如下

package com.test.Thread.t10;

/**
 * @author admin
 * 2017年4月20日
 */
public class Service {

    synchronized public static void printA(){
        try {
            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入pringA()");
            Thread.sleep(3000);
            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开pringA()");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    synchronized public static void printB(){
        try {
            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入printB()");
            
            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开printB()");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
//    synchronized public  void printC(){
//        try {
//            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入printC()");
//            
//            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开printC()");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
    
    
    public static void main(String[] args) {
        Service s=new Service();
        ThreadA a=new ThreadA(s);
        a.setName("A");
        a.start();
        
        ThreadB b=new ThreadB(s);
        b.setName("B");
        b.start();
//        
//        ThreadC c=new ThreadC(s);
//        c.setName("C");
//        c.start();
        
    }
}

class ThreadA extends Thread{
    private Service s;
    
    public ThreadA(Service s) {
        super();
        this.s = s;
    }
    @Override
    public void run() {
        s.printA();
    }
}


class ThreadB extends Thread{
    private Service s;
    
    public ThreadB(Service s) {
        super();
        this.s = s;
    }
    @Override
    public void run() {
        s.printB();
    }
}
//
//class ThreadC extends Thread{
//    private Service s;
//    
//    public ThreadC(Service s) {
//        super();
//        this.s = s;
//    }
//    @Override
//    public void run() {
//        s.printC();
//    }
//}

运行结果如下
这里写图片描述
同步效果执行,执行后在执行第二个 如果加到非static方法就不一样了 是异步的效果
放开注释的部分代码 再次运行 效果如下
这里写图片描述

这里异步的原因是因为持有不同的锁,一个是对象锁 ,一个是class锁 而calss锁可以对类的所有实例起作用

转载: https://blog.csdn.net/u010391342/article/details/70258159

posted @ 2020-09-08 16:31  沐春风-燕南飞  阅读(365)  评论(0编辑  收藏  举报