• 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

  • 相关阅读:
    利用calc()宽度计算做响应式布局
    设置背景图片后,使用backgroup-size出现的问题
    三、算法与控制结构
    C++数值计算
    python认识及环境变量
    Unity查找Editor下Project视图中特定的资源
    UGUI ScrollRect滑动居中CenterOnChild实现
    unity与android交互总结
    UGUI笔记
    UGUI性能优化
  • 原文地址:https://www.cnblogs.com/brithToSpring/p/13633382.html
Copyright © 2020-2023  润新知