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 @   沐春风-燕南飞  阅读(388)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示