JAVA synchronized详解
### JAVA synchronized详解 在Java编程语言中,`synchronized`是一个非常重要的关键字,它主要用于实现同步控制机制。通过使用`synchronized`,可以确保同一时刻只有一个线程能够访问被标记为同步的方法或代码块,从而避免多线程环境下的数据不一致问题。 #### 一、基本概念 `synchronized`关键字主要具有以下特性: 1. **互斥性**:如果一个线程获得了对象的锁,那么其他试图获取该锁的线程将会被阻塞,直到第一个线程释放锁。 2. **可见性**:当一个线程修改了共享变量,并释放锁后,另一个线程可以获得这个锁并能立即看到这个修改后的值。 3. **有序性**:`synchronized`可以保证代码块中的操作按照顺序执行。 #### 二、使用场景与语法 ##### 1. 同步方法 可以通过在方法声明前加上`synchronized`关键字来创建同步方法,例如: ```java public synchronized void method() { // 方法体 } ``` 对于静态方法,可以使用`synchronized`关键字修饰类名,例如: ```java public class MyClass { public static synchronized void staticMethod() { // 方法体 } } ``` ##### 2. 同步代码块 除了同步方法之外,还可以通过`synchronized`关键字来同步一段代码块,这种情况下需要指定同步监视器(锁对象),例如: ```java public void method() { Object obj = new Object(); synchronized (obj) { // 需要同步的代码 } } ``` #### 三、案例分析 为了更好地理解`synchronized`的工作原理,我们来看两个示例。 ##### 示例1:同步方法 下面的代码展示了一个使用同步方法的例子,其中定义了一个`Thread1`类,实现了`Runnable`接口。在这个类中,`run()`方法被`synchronized`修饰,这意味着同一时间只能有一个线程执行这段代码。 ```java public class Thread1 implements Runnable { @Override public void run() { synchronized (this) { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); } } } public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread ta = new Thread(t1, "A"); Thread tb = new Thread(t1, "B"); ta.start(); tb.start(); } } ``` 运行结果如下: ``` A synchronized loop 0 A synchronized loop 1 A synchronized loop 2 A synchronized loop 3 A synchronized loop 4 B synchronized loop 0 B synchronized loop 1 B synchronized loop 2 B synchronized loop 3 B synchronized loop 4 ``` 可以看到,线程A先执行了`synchronized`代码块中的所有循环,然后线程B才开始执行,这证明了`synchronized`能够保证同一时间只有一个线程执行。 ##### 示例2:同步代码块 在第二个例子中,我们定义了一个`Thread2`类,其中包含了两个方法:`m4t1()`和`m4t2()`。`m4t1()`使用了同步代码块,而`m4t2()`最初没有使用同步,之后进行了修改以观察不同情况下的执行结果。 ```java public class Thread2 { public void m4t1() { synchronized (this) { int i = 5; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + ":" + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } } public synchronized void m4t2() { // 修改后 int i = 5; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + ":" + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } public static void main(String[] args) { final Thread2 myt2 = new Thread2(); Thread t1 = new Thread(new Runnable() { @Override public void run() { myt2.m4t1(); } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { myt2.m4t2(); } }, "t2"); t1.start(); t2.start(); } } ``` 在`m4t1()`和`m4t2()`方法都被同步的情况下,运行结果如下: ``` t1:4 t1:3 t1:2 t1:1 t1:0 t2:4 t2:3 t2:2 t2:1 t2:0 ``` 从输出结果可以看出,线程`t1`和`t2`分别执行了各自的循环,但它们是交替进行的,这是因为它们都尝试获取同一个对象(即`Thread2`实例)的锁。 #### 四、总结 `synchronized`关键字是Java中实现线程安全的重要手段之一。通过将方法或代码块声明为同步,可以有效地防止多线程环境下可能出现的数据竞争和不一致性问题。需要注意的是,虽然`synchronized`能够提供强大的同步能力,但过度使用会导致性能下降,因此在实际应用中应根据具体情况合理选择同步策略。
- zartzwj2013-09-18不错,本来对这个概念就有点模糊,看了看,效果还不错
- yangsong5512013-12-26楼主辛苦你了,我的成功与你一般
- jnmaomao2013-08-09不错 将网上内容整合成一个txt了。。
- gaohua9526139042012-12-23很不错,挺详细的,顶一个。。。
- flash02212012-11-03楼主好资源,谢谢分享
- 粉丝: 1
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 8bit逐次逼近型SAR ADC电路设计成品 入门时期的第三款sarADC,适合新手学习等 包括电路文件和详细设计文档 smic0.18工艺,单端结构,3.3V供电 整体采样率500k,可实现基
- 操作系统实验 ucorelab4内核线程管理
- 脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果 bldc控制器方案,无刷电机 提供源码,原理图
- Matlab Simulink#直驱永磁风电机组并网仿真模型 基于永磁直驱式风机并网仿真模型 采用背靠背双PWM变流器,先整流,再逆变 不仅实现电机侧的有功、无功功率的解耦控制和转速调节,而且能实
- 157389节奏盒子地狱模式第三阶段7.apk
- 操作系统实验ucore lab3
- DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题 下面我将对程序进行详
- final_work_job1(1).sql
- 区块链与联邦学习结合:FedChain项目详细复现指南
- 西门子S7 和 S7 Plus 协议开发示例