Java 中synchronize函数的实例详解

java中的一个类的成员函数若用synchronized来修饰,则对应同一个对象,多个线程像调用这个对象的这个同步函数时必须等到上一个线程调用完才能由下一个线程调用。
那么如果一个类同时有两个成员函数是由synchronized修饰如代码所示,对与同一个对象,是否可以在两个线程运行时,一个调用funcA,同时另一个调用funcB?
Mysyn是这样一个类,如果我有两个线程,一个在run方法中先运行funcA再运行funcB,另一个线程在run方法中先运行funcB再运行funcA。那有没有可能出现这样的情况:在输出时start A...后面直接输出start B...?
public class MySyn {
public synchronized void funcA(String str){
System.out.println(str+":");
System.out.println("start A...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("...A end");
}
public synchronized void funcB(String str){
System.out.println(str+":");
System.out.println("start B...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("...B end");
}
}
测试代码如下:
这个线程是先运行funcA的
public class Mythread implements Runnable {
private MySyn mysyn;
private String id;
public Mythread(MySyn syn, String id){
this.mysyn = syn;
this.id = id;
}
@Override
public void run() {
this.mysyn.funcA(id);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.mysyn.funcB(id);
}
public static void main(String arg[]){
MySyn syn=new MySyn();
Thread t1 = new Thread(new Mythread(syn, "t1"));
Thread t2 = new Thread(new YourThread(syn, "t2"));
t1.start();
t2.start();
}
}
这个线程是先运行funcB的
public class YourThread implements Runnable {
private MySyn mysyn;
private String id;
public YourThread(MySyn syn, String id){
this.mysyn = syn;
this.id=id;
}
@Override
public void run() {
this.mysyn.funcB(id);
this.mysyn.funcA(id);
}
}
输出结果多是:
t1: start A... ...A end t2: start B... ...B end t2: start A... ...A end t1: start B... ...B end
如果取消Mythread的run方法中两个函数调用间的sleep,那结果多是:
t1: start A... ...A end t1: start B... ...B end t2: start B... ...B end t2: start A... ...A end
个人结果可能因线程调度不同,但是永远不会有:start A...后面直接输出start B...
那如果funcB不是一个同步函数,那上述代码运行结果会是怎么样呢?
代码稍加改动,把funcB的synchronized关键字去掉。运行结果为:
t2: t1: start A... start B... ...A end t1: start B... ...B end t2: start A... ...B end ...A end
显然出现了start A...后面直接输出start B...的结果。
同样如果Mysyn类如果有一个public 的成员变量,多线程也可以再同步函数被调用的同时,由另一个线程修改这个成员变量。
上述实验说明了:同步的成员函数只能在同一个对象的同步函数调用中对其他同步函数(包括本身)有排它的效果,即多线程运行中,同一个对象当前只能有一个同步函数在运行,但不排除其他非同步函数的运行或对成员进行访问。
那现在假设某个类有两个静态同步方法,那情况怎么样呢?
具体实现,我就不重复了,因为结果类似:
在多线程中,同一个类,当前只能有一个类同步函数(静态同步函数)在运行,但不排除其他非同步静态函数的运行或对静态成员的访问
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java
# 中synchronize函数的详解
# synchronize使用方法
# 中synchronize函数的理解
# Java关键字volatile和synchronized作用和区别
# Java 同步锁(synchronized)详解及实例
# java中synchronized(同步代码块和同步方法)详解及区别
# java synchronized同步静态方法和同步非静态方法的异同
# Java多线程程序中synchronized修饰方法的使用实例
# 实例解析Java中的synchronized关键字与线程安全问题
# Java中synchronized关键字修饰方法同步的用法详解
# 多线程
# 有一个
# 但不
# 或对
# 我就
# 多个
# 我有
# 是这样
# 如有
# 是由
# 希望能
# 所示
# 谢谢大家
# 说明了
# 永远不会
# 中对
# 可能出现
# 那有
# 则对
# 出现了
相关文章:
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何用PHP工具快速搭建高效网站?
深入理解Android中的xmlns:tools属性
如何快速搭建自助建站会员专属系统?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
全景视频制作网站有哪些,全景图怎么做成网页?
如何在云服务器上快速搭建个人网站?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何快速打造个性化非模板自助建站?
如何通过VPS建站无需域名直接访问?
为什么Go需要go mod文件_Go go mod文件作用说明
建站主机选择指南:服务器配置与SEO优化实战技巧
如何在建站之星绑定自定义域名?
网站制作员失业,怎样查看自己网站的注册者?
如何基于云服务器快速搭建网站及云盘系统?
建站之星如何实现PC+手机+微信网站五合一建站?
nginx修改上传文件大小限制的方法
学校为何禁止电信移动建设网站?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何在IIS7中新建站点?详细步骤解析
学校建站服务器如何选型才能满足性能需求?
如何确保西部建站助手FTP传输的安全性?
深圳网站制作培训,深圳哪些招聘网站比较好?
建站VPS配置与SEO优化指南:关键词排名提升策略
北京建设网站制作公司,北京古代建筑博物馆预约官网?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
如何实现建站之星域名转发设置?
中山网站推广排名,中山信息港登录入口?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
如何用花生壳三步快速搭建专属网站?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
C#如何序列化对象为XML XmlSerializer用法
如何快速搭建高效可靠的建站解决方案?
潮流网站制作头像软件下载,适合母子的网名有哪些?
建站主机是否等同于虚拟主机?
黑客如何通过漏洞一步步攻陷网站服务器?
,怎么用自己头像做动态表情包?
图册素材网站设计制作软件,图册的导出方式有几种?
如何在建站宝盒中设置产品搜索功能?
相册网站制作软件,图片上的网址怎么复制?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
企业微网站怎么做,公司网站和公众号有什么区别?
建站之星如何配置系统实现高效建站?
网站制作软件有哪些,制图软件有哪些?
非常酷的网站设计制作软件,酷培ai教育官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。