Java多线程-线程的同步(同步代码块)

本文通过一个具体的银行账户存款示例介绍了Java中同步代码块的使用方式及其优势。同步代码块允许开发者更精细地控制多线程环境下的资源访问,从而避免线程间的竞争条件,提高程序的并发性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。

追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。

在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。

package thread;

/**
 * 线程同步方法
 * 
 * @author administrator
 * 
 */
public class ThreadSynchronizedCode {

	public static void main(String[] args) {
		ThreadSynchronizedCode t = new ThreadSynchronizedCode();
		User u = t.new User("张三", 100);
		MyThread t1 = t.new MyThread("线程A", u, 20);
		MyThread t2 = t.new MyThread("线程B", u, -60);
		MyThread t3 = t.new MyThread("线程C", u, -80);
		MyThread t4 = t.new MyThread("线程D", u, -30);
		MyThread t5 = t.new MyThread("线程E", u, 32);
		MyThread t6 = t.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
		 *            欲存款金额
		 * 
		 */
		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 + '}';
		}
	}
}

运行结果:

线程线程A运行结束,增加“20”,当前用户账户余额为:120
线程线程B运行结束,增加“-60”,当前用户账户余额为:60
线程线程C运行结束,增加“-80”,当前用户账户余额为:-20
线程线程E运行结束,增加“32”,当前用户账户余额为:12
线程线程D运行结束,增加“-30”,当前用户账户余额为:-18
线程线程F运行结束,增加“21”,当前用户账户余额为:3


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值