博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
synchronized 修饰在 static方法和非static方法的区别
阅读量:6979 次
发布时间:2019-06-27

本文共 2778 字,大约阅读时间需要 9 分钟。

Java中synchronized用在静态方法和非静态方法上面的区别

在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。所以,他们之间不会产生互斥。

上代码

package TestSynchronizedStaticOrNot;public class TestSynchronizedStaticOrNot {
public static synchronized void staticFunction(String name) throws InterruptedException { for (int i = 0; i < 3; i++) { Thread.sleep(1000); System.out.println(name + " --- static function running ..."); } } public synchronized void function(String name) throws InterruptedException { for (int i = 0; i < 3; i++) { Thread.sleep(1000); System.out.println(name + " +++ function running ..."); } } public static void main(String[] args) { final TestSynchronizedStaticOrNot demo = new TestSynchronizedStaticOrNot(); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { staticFunction("1"); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread thread11 = new Thread(new Runnable() { @Override public void run() { try { staticFunction("2"); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { demo.function("1"); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread thread23 = new Thread(new Runnable() { @Override public void run() { try { demo.function("12"); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread thread22 = new Thread(new Runnable() { @Override public void run() { try { new TestSynchronizedStaticOrNot().function("2"); } catch (InterruptedException e) { e.printStackTrace(); } } }); thread11.start(); thread1.start(); thread2.start(); thread23.start(); thread22.start(); }}

这里写图片描述

根据结果很容分析到,加在类上面的锁,加载对象上面的锁。如果上了对象锁,同一个对象是不能再获取锁的,必须等待释放,如果是不同的实例还是可以去获取锁的。

那当我们想让所有这个类下面的方法都同步的时候,也就是让所有这个类下面的静态方法和非静态方法共用同一把锁的时候,我们如何办呢?此时我们可以使用Lock。

你可能感兴趣的文章
【BZOJ】3542: DZY Loves March
查看>>
IOS-XMPP
查看>>
开源 免费 java CMS - FreeCMS1.9 全文检索
查看>>
LINUX 查找tomcat日志关键词
查看>>
[转]Git忽略规则及.gitignore规则不生效的解决办法
查看>>
Windows Server 2008 R2安装子域控制器
查看>>
分享Kali Linux 2017年第11周镜像文件
查看>>
Mac homebrew类似apt-get命令安装包
查看>>
ARM WFI和WFE指令【转】
查看>>
Windows server 2008普通用户不能远程登录问题
查看>>
Linux进程管理工具Supervisor
查看>>
Service的基本组成
查看>>
通过案例练习掌握SSH 的整合
查看>>
find ip from hostname or find hostname from ip
查看>>
谈谈UI架构设计的演化
查看>>
DNS 到底怎么工作的? (How does dns work?)
查看>>
从当前日期算起,获取几天前的日期和几个月前的日期
查看>>
linux中普通文件和块设备文件的区别
查看>>
Android中Service深入学习
查看>>
[转]CentOS 5.5下FTP安装及配置
查看>>