对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。
追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。
在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。
/**
* Java线程:线程的同步-同步代码块
*
* @author leizhimin 2009-11-4 11:23:32
*/
public class Test {
public static void main(String[] args) {
User u = new User("张三", 100);
MyThread t1 = new MyThread("线程A", u, 20);
MyThread t2 = new MyThread("线程B", u, -60);
MyThread t3 = new MyThread("线程C", u, -80);
MyThread t4 = new MyThread("线程D", u, -30);
MyThread t5 = new MyThread("线程E", u, 32);
MyThread t6 = new MyThread("线程F", u, 21);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
}
class MyThread extends Thread {
private User u;
private int y = 0;
MyThread(String name, User u, int y) {
super(name);
this.u = u;
this.y = y;
}
public void run() {
u.oper(y);
}
}
class User {
private String code;
private int cash;
User(String code, int cash) {
this.code = code;
this.cash = cash;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
/**
* 业务方法
*
* @param x 添加x万元
*/
public void oper(int x) {
try {
Thread.sleep(10L);
synchronized (this) {
this.cash += x;
System.out.println(Thread.currentThread().getName() + "运行结束,增加“" + x + "”,当前用户账户余额为:" + cash);
}
Thread.sleep(10L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "User{" +
"code='" + code + '\'' +
", cash=" + cash +
'}';
}
}
线程E运行结束,增加“32”,当前用户账户余额为:132
线程B运行结束,增加“-60”,当前用户账户余额为:72
线程D运行结束,增加“-30”,当前用户账户余额为:42
线程F运行结束,增加“21”,当前用户账户余额为:63
线程C运行结束,增加“-80”,当前用户账户余额为:-17
线程A运行结束,增加“20”,当前用户账户余额为:3
Process finished with exit code 0
注意:
在使用synchronized关键字时候,应该尽可能避免在synchronized方法或synchronized块中使用sleep或者yield方法,因为synchronized程序块占有着对象锁,你休息那么其他的线程只能一边等着你醒来执行完了才能执行。不但严重影响效率,也不合逻辑。
同样,在同步程序块内调用yeild方法让出CPU资源也没有意义,因为你占用着锁,其他互斥线程还是无法访问同步程序块。当然与同步程序块无关的线程可以获得更多的执行时间。
分享到:
相关推荐
压缩包中的"线程同步"文件很可能包含了使用C++或者C语言实现的这些同步机制的实例代码。这些实例可能包括创建、等待、释放等操作,以及如何处理各种同步异常情况,比如死锁。通过学习这些实例,开发者可以更好地理解...
"Java多线程同步.pdf" Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用...
总结来说,Java中的同步代码块是一种有效的解决线程安全问题的手段,通过限制对共享资源的并发访问,可以保证数据的一致性和线程的安全性。然而,过度使用同步可能会降低程序的性能,因此需要合理设计同步范围,确保...
4. **临界区(Critical Section)**:临界区是最简单的线程同步方式,它定义了一段代码,同一时间只有一个线程可以执行。VC++的`EnterCriticalSection`和`LeaveCriticalSection`函数用于进入和离开临界区。 在这个...
1. **临界区(Critical Section)**:临界区是一种简单的线程同步机制,用于保护一小段代码,使得在同一时间只有一个线程可以执行这段代码。例如,在公交车上,当司机启动车辆时(临界区),售票员不应同时开启车门...
在C#中,线程同步通常用于确保在某一时刻只有一个线程可以访问特定的代码块或资源,从而保证程序的正确性。 线程同步的方法多种多样,包括但不限于以下几种: 1. **Monitor**:C#的`Monitor`类提供了`Enter`和`...
这种机制可以防止数据竞争,确保同一时间只有一个线程能执行特定的代码块。 2. **自旋锁(Spin Lock)**: 自旋锁与互斥锁类似,但其在等待锁的过程中不会让出CPU,而是不断地检查锁的状态。在GCD中,我们可以通过...
3. **临界区(Critical Sections)**:临界区是一种更轻量级的同步原语,只允许一个线程进入特定的代码块。TInterlocked和TCriticalSection类在Delphi中提供了临界区的支持,防止多个线程同时执行临界代码。 4. **...
例如:`lock (obj) { /* 临界区 */ }`,确保同一时刻只有一个线程能执行被锁定的代码块。 3. **Mutex**: Mutex是跨进程的同步对象,允许一个或多个线程对资源进行互斥访问。与Monitor不同,Mutex可以在不同进程间...
2. **同步代码块**:使用`{}`包裹需要同步的代码,前缀是`synchronized (object)`,其中`object`是同步监视器,通常是共享资源的对象。 ### 二、wait-notify 机制 wait、notify和notifyAll是Object类的三个方法,...
- **同步块**:使用`synchronized`关键字包围代码块,指定要锁定的对象,例如: ```java synchronized (object) { // ... } ``` - **wait(), notify(), notifyAll()**:这些方法属于`Object`类,用于线程间的...
### 售票窗口模拟线程同步:深入解析与实现 在多线程环境中,线程同步是一项关键的技术,用于确保多个线程访问共享资源时的正确性和一致性,避免资源竞争和数据不一致等问题。本文将通过一个具体的案例——售票窗口...
使用`synchronized`可以锁定代码块或整个方法,确保同一时间只有一个线程可以执行。 6. **线程间的通信** Java提供了多种线程间通信的手段,如`BlockingQueue`、`Future`、`ExecutorService`等。其中,`wait()`, `...
Monitor类提供了Enter和Exit方法来获取和释放对象锁,确保同一时间只有一个线程能访问受保护的代码块,即临界区。与lock语句类似,但Monitor提供更多的灵活性,如TryEnter尝试获取锁、Wait使当前线程等待、Pulse和...
本教程将深入讲解Java中的多线程以及同步控制机制,特别是同步代码块和同步方法。 首先,我们要理解什么是线程。线程是程序执行的最小单位,一个进程中可以有多个线程并发执行。在Java中,可以通过实现`Runnable`...
当线程调用一个对象的`synchronized`方法时,它会获取该对象的锁,其他线程试图调用该对象的任何`synchronized`方法或同步代码块时,都会被阻塞,直到锁被释放。 3. **wait()和notify()方法**:这些方法是Object类...
- ** synchronized关键字**:可以用于方法或代码块,确保同一时间只有一个线程能执行特定代码。 - ** Lock接口**(如ReentrantLock):比synchronized更灵活,支持公平锁、非公平锁,以及尝试获取锁等功能。 - **...
同步代码块和同步方法是Java中确保线程安全的重要机制。它们各有优缺点,适用于不同的场景。在实际开发中,开发者应该根据具体需求选择合适的同步机制。通过合理使用同步代码块和同步方法,可以有效地控制线程对共享...