java多线程同步

初学java同步,从csdn首页推荐上看了这个文章,自己实现了下,并加了点体会,作为自己学习的见证

也方便日后查看。

package com.test.thread; /* * 多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问。 下面以一个简单的实例来进行对比分析。 实例要完成的工作非常简单,就是创建10个线程,每个线程都打印从0到99这100个数字,我们希望线程之间不会出现交叉乱序打印,而是顺序地打印。 先来看第一段代码,这里我们在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,但结果并不如我们希望那样, 这是因为这里synchronized锁住的是this对象,即当前运行线程对象本身。代码中创建了10个线程, 而每个线程都持有this对象的对象锁,这不能实现线程的同步。 * * */ public class ThreadTest { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { for (int i=0;i<10;i++){ new Thread(new MyThread(i)).start(); Thread.sleep(1); } } } class MyThread implements java.lang.Runnable{ private int threadId; public MyThread(int id){ this.threadId=id; } public synchronized void run() { //加了同步也不行,只是同步了this对象,每个this对象都有一个run方法 for (int i = 0; i < 100; ++i) { System.out.println("Thread ID: " + this.threadId + " : " + i); } } }

package com.test.thread; /* * * 从上述代码段可以得知,要想实现线程的同步,则这些线程必须去竞争一个唯一的共享的对象锁。 基于这种思想,我们将第一段代码修改如下所示,在创建启动线程之前,先创建一个线程之间竞争使用的Object对象, 然后将这个Object对象的引用传递给每一个线程对象的lock成员变量。 这样一来,每个线程的lock成员都指向同一个Object对象。 我们在run方法中,对lock对象使用synchronzied块进行局部封锁,这样就可以让线程去竞争这个唯一的共享的对象锁,从而实现同步。 * * */ public class ThreadTest2 { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { Object obj=new Object(); //利用外部对象来同步Thread for (int i=0;i<10;i++){ new Thread(new MyThread2(i,obj)).start(); Thread.sleep(1); } } } class MyThread2 implements java.lang.Runnable{ private int threadId; private Object lock; //新加入了一个lock public MyThread2(int id,Object lock){ this.threadId=id; this.lock=lock; } public void run() { synchronized(lock){ for (int i = 0; i < 100; ++i) { System.out.println("Thread ID: " + this.threadId + " : " + i); } } } }

package com.test.thread; /* * 从第二段代码可知,同步的关键是多个线程对象竞争同一个共享资源即可,上面的代码中是通过外部创建共享资源,然后传递到线程中来实现。 * 我们也可以利用类成员变量被所有类的实例所共享这一特性,因此可以将lock用静态成员对象来实现,代码如下所示: * * */ public class ThreadTest3 { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { for (int i=0;i<10;i++){ new Thread(new MyThread3(i)).start();//同一个类的实例都共享静态lock对象 Thread.sleep(1); } } } class MyThread3 implements java.lang.Runnable{ private int threadId; private static Object lock=new Object(); //静态类成员变量,被所有类的实例所共享 public MyThread3(int id){ this.threadId=id; } public void run() { synchronized(lock){ for (int i = 0; i < 100; ++i) { System.out.println("Thread ID: " + this.threadId + " : " + i); } } } }

package com.test.thread; /* * 再来看第一段代码,实例方法中加入sychronized关键字封锁的是this对象本身,而在静态方法中加入sychronized关键字封锁的就是类本身。 * 静态方法是所有类实例对象所共享的,因此线程对象在访问此静态方法时是互斥访问的,从而可以实现线程的同步,代码如下所示: * * */ public class ThreadTest4 { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { for (int i=0;i<10;i++){ new Thread(new MyThread4(i)).start(); Thread.sleep(1); } } } class MyThread4 implements java.lang.Runnable{ private int threadId; public MyThread4(int id){ this.threadId=id; } public void run() { taskHandler(threadId); } private static synchronized void taskHandler(int threadId){ //利用静态方法实现同步,原理同静态变量 for (int i = 0; i < 100; ++i) { System.out.println("Thread ID: " + threadId + " : " + i); } } }

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值