多线程入门:Synchronized与SingleThreadedExecution详解
多线程是计算机程序设计中一种重要的并发处理技术,它允许一个程序同时执行多个任务或子任务。本篇文章主要介绍了多线程的基础知识,特别是关注于线程同步和单线程执行模式(SingleThreadedExecution)的理解。 首先,我们提到的是`Vector`,这是Java早期的一个线程安全容器,它的安全性体现在其内部的线程同步机制,确保对象的字段值在多线程环境下的可见性和一致性。由于线程安全,`Vector`适用于多线程场景,但随着Java的发展,现在推荐使用更高效且线程安全的集合框架,如`ConcurrentHashMap`。 单线程执行模式,正如其名,意味着每个任务或操作都在单个线程上顺序执行。这个模式确保了代码的线程安全,因为只有一个线程可以访问共享资源。然而,这可能会导致性能瓶颈,因为当多个线程竞争同一把锁时,会有线程阻塞等待,直到获得锁后才能继续执行。例如,`Hashtable`的所有方法都采用这种模式,而`ConcurrentHashMap`通过分段和无锁数据结构优化,减少了同步开销,提高并发性能。 编程实践中,对于不想被重复赋值的字段,使用`final`关键字是一个良好实践,因为这保证了字段的值在初始化后不会改变,从而避免了潜在的线程安全问题。同时,测试线程安全性的方法需要足够的迭代和时间点,以确保结果的可靠性,避免测试结果受偶然因素影响。 `SharedResource`类是多线程环境中常见的对象,它可能包含安全方法(即同步方法)和非安全方法。为了确保多线程间的协作,非安全方法需要使用`synchronized`关键字进行互斥,防止并发修改导致的数据不一致。然而,过度使用同步会带来性能损失,因此需权衡并发控制的必要性。 Java编程规范指出,对于`long`和`double`类型的字段,简单的赋值操作在多线程下并不保证原子性,可能导致中间状态或不可预测的结果。为了解决这个问题,可以在这些字段前添加`volatile`关键字,使读写操作变为原子操作,避免竞态条件。 最后,当线程数量远超可用资源时,使用信号量`Semaphore`就显得尤为重要。`Semaphore`通过控制线程的进入和退出,帮助管理并发访问,`semaphore.acquire()`和`semaphore.release()`方法的配合确保了线程的进出是有序且控制的。 总结来说,这篇文章深入浅出地讲解了多线程编程中的基本概念、线程同步策略(如`synchronized`和`volatile`)、单线程执行模式及其局限性,以及如何通过`Semaphore`来管理并发访问。对于初学者来说,这是理解和应用多线程技术的重要起点。
安全性:对象的字段值与预期的一致
生存性:必要的处理能够被执行
可复用性:类可重复利用
性能:能快速,大批量地执行处理
第一种:Single Threaded Execution模式:能通过这座桥的只有一个人
将不想被重复赋值的字段声明为final字段是一种良好的编程习惯。
测试结果具有欺骗性,需要测试的次数足够,时间点多
SharedResource角色是可被多个线程访问的类,包含安全方法和不安全方法
将不安全的方法用synchronize修饰,使其不被多个线程同时访问
Single Threaded Execution模式会降低程序性能,一获取锁花费时间,二线程
冲突引起的等待
Hashtable中的所有方法都采用Single Threaded Execution模式,
而ConcurrentHashMap则将内部数据结构分成多段,针对各段操作的线程互不相干,
因而也就无需针对其他线程执行互斥处理。
但是,实际性能和运行环境也紧密相关,也不是说在任何情况下ConcurrentHashMap就
一定是有利的。
Java编程规范规定,long,double的赋值和引用操作并不是原子的。
long类型字段longField,某个线程执行了以下赋值操作
longField=123L;
同时另外一个线程执行了以下赋值操作:
longField=466L;
那么longField的值是无法确定的,有可能是123L,也有可能是466L,还有可能是0L,也有可能是31415926L.
在声明该字段时加上volatile关键字,那么对该字段的操作就是原子操作了
线程的数量比资源的数量要多时,我们就需要使用计数信号量Semaphore
semaphore.acquire()和semaphore.release()必须成对调用
下载后可阅读完整内容,剩余1页未读,立即下载
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展