Java多线程并发编程 Synchronized关键字
现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的同步锁,同时,线程 B 也去调用 Test 的 synchronized 方法,此时线程 B 无法获得 Test 的同步锁,必须等待线程 A 释放 Test 的同步锁才能获得从而执行对应方法的代码 Java中的`synchronized`关键字是多线程编程中用于实现线程同步的重要机制,它确保了在多线程环境下对共享资源的访问具有互斥性和可见性。这些特性使得`synchronized`成为解决并发问题的关键工具。 1. **同步锁机制**: 每个Java对象都有一个与之关联的内置锁,也称为监视器锁或同步锁。当一个线程进入由`synchronized`修饰的方法或代码块时,会自动获取该对象的同步锁,如果同步锁已经被其他线程持有,那么当前线程将会被阻塞,直到该锁被释放。在上述示例中,`Test`类的`count`方法被`synchronized`修饰,因此线程A和线程B在尝试调用`count`时,只有一个线程能获得锁并执行,另一个线程则必须等待。 2. **原子性保证**: `synchronized`关键字确保了在同一时刻,只有一个线程可以执行特定的同步代码,从而保证了操作的原子性。这意味着在`synchronized`代码块或方法内部,不会出现线程间的数据竞争,对于共享变量的修改不会被中断。例如,在`DEMO1`和`DEMO2`中,`count`方法的循环执行不会被线程切换所打断,确保了每个线程完整地执行完6次循环。 3. **内存可见性**: 当一个线程在`synchronized`代码块内修改了共享变量,其他线程在获取同步锁后,能够看到这些修改,这是因为`synchronized`提供了内存屏障,强制将修改后的值刷新到主内存,并清空工作内存中的旧值。这样就避免了因缓存不一致导致的问题。 4. **两种使用方式**: - **synchronized 方法**:在方法声明前加上`synchronized`关键字,整个方法体被视为同步代码块。 - **synchronized 代码块**:使用`synchronized (对象)`结构,指定一个对象作为锁,同步代码块包含在大括号中。 5. **特性详解**: - **互斥性**:同一时间只有一个线程可以执行同步代码,其他线程必须等待锁的释放。 - **可重入性**:一个线程已经获得了对象的锁,它可以再次请求这个锁(如递归调用同步方法)而不会造成死锁。 - **锁释放**:当同步代码块或方法执行完毕或者遇到异常时,同步锁会被自动释放。 6. **局限性**: - 性能开销:`synchronized`会带来一定的性能损耗,因为锁的获取和释放都需要操作系统支持。 - 锁定粒度:`synchronized`锁定的是整个方法或代码块,粒度较大,可能会影响其他非冲突代码的并发执行。 - 不适用于静态初始化块和静态方法,它们使用类的Class对象作为锁,可能导致意外的锁竞争。 7. **其他并发控制手段**: - `java.util.concurrent`包提供了更高级的并发控制工具,如`ReentrantLock`、`Semaphore`、`CountDownLatch`等,它们在某些场景下提供了比`synchronized`更灵活的控制和更好的性能。 正确理解和使用`synchronized`关键字对于编写高效、安全的并发程序至关重要。在实际开发中,应根据具体需求选择合适的同步机制,以确保并发程序的正确性和性能。



























- 粉丝: 5
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 项目管理理论特点及其风险管理.docx
- 二信号发生器示波器和数据处理应用软件.doc
- 大数据时代档案管理转型研究.docx
- 换热网络设计教程.doc
- 计算机网络笔记.docx
- 通信工程中设备防雷接地抗干扰设计探析.docx
- 项目管理心得一个项目经理的个人体会经验总结.doc
- 《某电子商务平台系统设计》.doc
- 园林施工项目管理的基本方法与管理过程探析.docx
- 计算机三维动画设计课程教学改革探究.docx
- 教学管理信息系统数据库的构建与设计.doc
- 信息系统项目管理师分类模拟题项目时间管理.doc
- 工学结合的嵌入式工程应用型人才培养实践体系构建与探索.docx
- 智能大厦综合布线系统的设计方案范例资料.ppt
- 个经典电气工程CAD图纸.doc
- 《软件工程:实践者研究方法》(上).ppt


