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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip