多线程之synchronized
发布日期:2022-04-11 08:52:45 浏览次数:11 分类:技术文章

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

与volatile不同的是 synchronized不能对变量使用

目录


虽然说synchronized不能直接对变量使用,但是可以对调用他的方法的上锁,从而实现对其上锁

对于普通方法锁是当前对象

例:

public class Person {    private int f = 0;    public synchronized void m1(String x){        System.out.println(x+"执行加锁普通m1");        try {            Thread.sleep(3000);        }catch (InterruptedException e){            e.printStackTrace();        }        System.out.println(x+"执行结束加锁普通m1");    }    public  void m2(String x){        System.out.println(x+"执行无锁普通m2");        try {            Thread.sleep(3000);        }catch (InterruptedException e){            e.printStackTrace();        }        System.out.println(x+"执行无锁普通m2结束");    }    public synchronized void m3(String x){        System.out.println(x+"执行加锁普通m3");        try {            Thread.sleep(3000);        }catch (InterruptedException e){            e.printStackTrace();        }        System.out.println(x+"执行结束加锁普通m3");    }}

main方法

public static void main(String[] args) {        Person p1 = new Person();        Thread t1 = new Thread() {            @Override            public void run() {                p1.m1("线程t1");            }        };        Thread t2 = new Thread() {            @Override            public void run() {                p1.m2("线程t2");                p1.m3("线程t2");            }        };        t1.start();        t2.start();    }

结果 

 

首先可以看出线程t1执行后,立马执行无锁的t2,说明虽然对对象方法上锁等于锁住实例对象但是对于无锁方法来说无效,只是锁有锁的方法。m2方法立即执行完毕。然后等待三秒,等待完成m1的执行,对p1解锁才让m3执行这也证明了,对于普通方法锁是当前对象

对于静态同步法,锁是当前类的Class对象。

首先可以 看出仍然对无锁的普通的m2无影响,m3同样等了m1执行结束,释放Person类的锁,m3才执行

接着将m2换成静态可见结果仍一样

 对于同步方法块。锁是Synchronized括号里配置的对象。

public static void main(String[] args) {        Integer A=0;        Thread t1 = new Thread() {            @Override            public void run() {                synchronized(A){                    try {                        System.out.println("线程t1打印"+(A));                        Thread.sleep(3000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }                System.out.println("代码块执行完毕,释放锁");                try {                    Thread.sleep(1000);                    System.out.println("t1才刚刚执行完,没想到吧");                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        };        Thread t2 = new Thread() {            @Override            public void run() {                synchronized(A){                    System.out.println("线程t2打印"+A);                }            }        };        t1.start();        t2.start();    }

看执行结果

 

 同样是t1对A上锁,在代码块执行完了,t2就开始对A操作,t2打印完,过一段时间才执行完t1,所以很明显,锁只在块内对A限制

转载地址:https://blog.csdn.net/weixin_56289362/article/details/123602453 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:多线程之内置锁原理简介
下一篇:多线程之sleep和wait的区别

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月05日 10时21分38秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java 远程调试 端口_JAVA远程调试 2019-04-21
java 使用或覆盖了已过时的api_JAVA使用或覆盖了已过时的 API 2019-04-21
java 图片旋转保存_Java 对图片90度旋转 2019-04-21
用java实现文学研究助手_数据结构文学研究助手 C语言代码实现(带源码+解析)... 2019-04-21
java gc的几种方式_GC 的三种基本实现方式 2019-04-21
wget linux java 32_通过wget在Linux上下载Java JDK会显示在许可证页面上 2019-04-21
babylonjs 设置面板位置_babylonjs 空间坐标转为屏幕坐标 2019-04-21
oracle里面如何查询sqlid,CSS_oracle中如何查看sql, --查询表状态:  select uo.O - phpStudy... 2019-04-21
oracle 查询中用case,oracle case when 在查询时候的用法。 2019-04-21
oracle正在运行的程序包,ORACLE PL/SQL编程详解之程序包的创建与应用 2019-04-21
php局部页面滚动,在访问另一页面后保留浏览器滚动位置 - php 2019-04-21
jmeter运行linux命令行,Jmeter在linux上运行(命令行运行Jmeter) 2019-04-21
linux服务器怎么添加站点,如何增加站点或虚拟主机及文件说明 2019-04-21
linux系统输入指令,Linux系统基础 - 基本操作命令 2019-04-21
linux设备管理命令,Linux命令(设备管理).doc 2019-04-21
linux 中文utf-8转gbk编码,Linux平台下 GBK编码转UTF-8编码 2019-04-21
linux安装软件在boot,在Linux系统上安装Spring boot应用的教程详解 2019-04-21
linux进入用户user1主目录,Linux系统命令提示符为[user1@localhost root]当前用户所在目录为( )... 2019-04-21
取消linux自动登录,linuxdeepin 如何取消自动登录啊? 2019-04-21
linux线程存储,Linux系统编程手册:线程:线程安全和每线程存储 2019-04-21