这篇文章主要介绍了Java 中synchronize函数的实例详解的相关资料,希望通过本文能帮助到大家理解使用synchronize函数的使用方法,需要的朋友可以参考下
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函数的示例分享的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

WebStorm Mac版
好用的JavaScript开发工具

Dreamweaver CS6
视觉化网页开发工具