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

转载 2013年12月02日 13:46:28
对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。

追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此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


举报

相关文章推荐

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

Java多线程-线程的同步(同步代码块) 对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。 追其同步的根本的目的,是控制竞争资源的正确的访问,因...

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

对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。 追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

多线程(四)线程的同步之同步代码块

之所以会出现《多线程(四)线程的同步之线程安全问题》文章中的问题,其原因是因为run方法体不具有同步安全性:程序中有两条并发线程在修改Account对象。一个线程进入方法准备减少取钱金额,但是还没减少...

线程同步--线程同步--线程同步--线程同步--线程同步

线程同步:   由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。...

JAVA——多线程编程之同步:同步代码块与同步函数(二)

【4】多线程的同步的两种方法 线程同步:程序中不能有多个线程同时在一段代码之间执行。 多线程的同步的两种方法:同步代码块、同步函数。 【4-1】同步代码块 为解决【3-1】中的问题,一种方法是保证以下...

多线程、同步代码块

多线程

多线程——同步代码块

/* 通过分析,发现,打印出0,-1,-2等错票。 多线程的运行出现了安全问题。 问题的原因: 当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完, 另一个...

多线程(3)—同步代码块

1.同步机制: java任意类型的对象都有一个标志位该标志位有0、1两种状态,其开始状态为1,当某个状态执行了synchronized(object)语句后object对象的标志位变为0状态,直到执...
  • T_P_F
  • T_P_F
  • 2017-08-08 16:54
  • 43

Java 多线程应用小结(一)

引言我们今天所使用的操作系统是多任务操作系统。多线程就是是实现多任务的一种方式。一个程序可以看作为一个进程,进程是是一个正在执行中的程序,每一个进程执行都是有一个执行顺序,该顺序是一个执行路径或者叫一...

java多线程㈡—线程安全问题(同步代码块or同步函数)

摘要:上一篇文章,写了实现java多线程的方式,以售票为示例来说明,可是我们看到和我们实际有很大的问题,这一骗文章主要用同步块和同步方法,解决售票问题,以实现Runnable接口为例。 为什么要用...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)