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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义