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多线程系列(二)---synchronized同步代码块

简介上一篇文章我们学习了synchronized同步方法的一些,今天来学习synchronized代码块的内容,上一篇文章请看java多线程系列(一)–synchronized同步方法 1.1 syn...

JAVA基础 day11 多线程 同步代码块 死锁问题

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。线程 是进程中的一个独立控制单元。线程控制着进程的执行。当一个程序启动时,就有一个进程被操作系...

Java---13---多线程---synchronized 同步代码块

还是之前卖票的例子: class Test implements Runnable { private int num = 50; Object obj = new Object()...

Java基础 - 多线程,两种实现方式(继承Thread,实现Runnable接口),设置获取名字,同步代码块、方法,死锁

Java基础 - 多线程,两种实现方式(继承Thread,实现Runnable接口),设置获取名字,同步代码块、方法,死锁...

java 多线程学习笔记2-同步代码块,死锁

1、多线程-同步代码块:synchronized     当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步。     如...

Java【多线程知识总结(7)】多线程同步问题-关于synchronized代码块和synchronized方法的应用

下面的程序会逐步引出synchronized的用法: [例] class TicketMan { public static void main(String[]aresg) { Ticket...

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

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

黑马程序员:多线程的介绍、应用及由安全问题引出的同步代码块介绍

进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元 线程:进程中一个独立的控制单元,实质上是线程在控制着进程的执行,一个进程中至少有一个线程 JV...

知识点:简单的异常处理,多线程,同步代码块

/**  * 异常处理(老师用电脑)感觉老师这样写不好。处理电脑的异常放在老师的类里里面。处理老师的异常放在主函数里面。  * @author Administrator  *  */ cl...

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

1.同步机制: java任意类型的对象都有一个标志位该标志位有0、1两种状态,其开始状态为1,当某个状态执行了synchronized(object)语句后object对象的标志位变为0状态,直到执...
  • T_P_F
  • T_P_F
  • 2017年08月08日 16:54
  • 90
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java多线程-线程的同步(同步代码块)
举报原因:
原因补充:

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