多线程的同步控制

原创 2016年05月30日 19:54:04

多进程的同步控制是避免数据的混乱,尤其是对共享数据

解决的办法:多进程共享的数据只允许同一时刻一个线程处于操作之中(synchronized)



几个重要的概念:

临界资源(同步资源):多线程共享的资源或数据

临界区(临界代码):每个线程中访问临界资源的那一段代码,简单的说就是在一个时刻只能被一个线程访问的资源

synchronized的用法:可以把synchronized想象成一把锁,专门锁住一个线程正在访问临界资源的临界区。访问结束就把锁给下一个线程

格式一:同步语句

Synchronized (对象)

{

临界代码段

}


格式二:同步方法

public synchronized 返回类型 方法名()

{

方法体

}

或者

public 返回类型 方法名()

{

synchronized(this)

{

方法体

}

}



不加synchronized的银行取款应用程序

package practice4;

public class Mbank {
	private static int sum=2000;
	public  static void take(int k){
		int temp=sum;
		temp-=k;
		try {
			Thread.sleep((int)(1000*Math.random()));
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		sum=temp;
		System.out.println("sum="+sum);
	}
}
public class Customer extends Thread{
	public void run(){
		for(int i=1;i<=4;i++){
			Mbank.take(100);
		}
	}
	
}
package practice4;

public class App11_6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Customer c1=new Customer();
		Customer c2=new Customer();
		c1.start();
		c2.start();
	}

}
运行结果:

sum=1900
sum=1900
sum=1800
sum=1700
sum=1600
sum=1800
sum=1700
sum=1600
运行结果显然不对,数据已经混乱


加了synchronized的银行取款应用程序

package practice4;

public class Mbank {
	private static int sum=2000;
	public synchronized static void take(int k){
		int temp=sum;
		temp-=k;
		try {
			Thread.sleep((int)(1000*Math.random()));
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		sum=temp;
		System.out.println("sum="+sum);
	}
}
public class Customer extends Thread{
	public void run(){
		for(int i=1;i<=4;i++){
			Mbank.take(100);
		}
	}
	
}
public class App11_6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Customer c1=new Customer();
		Customer c2=new Customer();
		c1.start();
		c2.start();
	}

}

运行结果:

sum=1900
sum=1800
sum=1700
sum=1600
sum=1500
sum=1400
sum=1300
sum=1200

多线程之间的同步控制

问题:同时运行的几个线程需要共享一个数据,并且要考虑到彼此的状态和动作。例如,当一个线程对共享的数据进行操作时,在没有完成相关操作之前,不允许其他线程打断它,否则会破坏数据的完整性。也就是说,被多个线...
  • lhc2207221755
  • lhc2207221755
  • 2015年10月05日 10:52
  • 1653

Java多线程的同步控制记录

Java多线程的同步控制记录 读《实战Java高并发程序设计》所做的笔记!
  • u011244202
  • u011244202
  • 2017年03月30日 19:11
  • 219

C#中的多线程-线程同步基础 (控制线程数量)

同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个...
  • u011555996
  • u011555996
  • 2017年11月28日 20:40
  • 111

Java 并发编程 同步控制 三

1、 重入锁 ReentrantLock synchronized 的重入锁: ReentrantLock。 重入锁需要手动进行加锁和解锁: lock 和unlock。public class...
  • chao_19
  • chao_19
  • 2017年06月25日 15:17
  • 87

Win32 多线程程序设计(4)— 同步控制

2011 年 09 月 05 日 by name5566 Win32 提供了不少同步机制。 Critical Sections(临界区) Critical sections 是 ...
  • boyhailong
  • boyhailong
  • 2012年12月23日 20:36
  • 684

nodejs学习笔记(二)——javascript的同步异步行为和多线程

写过后台的同学一定对线程、线程池或者是多线程这些概念不会陌生,但是前台在HTML5之前很少会提及,因为在HTML5之前javascript都是单线程的。下面用一个简单的例子来说明一下单线程: se...
  • lqlqlq007
  • lqlqlq007
  • 2016年09月10日 11:47
  • 1058

《Win32多线程程序设计》(3)---同步控制

让我先对同步(synchronous)与异步(asynchronous)做个说明。当程序1调 用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继 续下去,这就是所谓的“synchron...
  • LeeLaoHan
  • LeeLaoHan
  • 2014年02月11日 16:34
  • 532

多线程中采用锁控制并发

在多线程编程当中对于共享变量的控制非常重要,平常的程序当中由于是单线程去处理的,因此不会出现变量资源同时被多个线程同时访问修改,程序的运行是顺序的。然而多线程的环境中就会出现资源同时被多个线程获取,同...
  • dotnetstudio
  • dotnetstudio
  • 2016年07月27日 22:51
  • 2078

脚本备份(up/kill后台的server)

up a webstation#! /bin/cshcd $WS_HOME/bin./kill_web.shsleep 2./clean_up_users >& $WS_LOG_PATH/clear_...
  • Thinylee
  • Thinylee
  • 2011年06月17日 09:11
  • 380

java同步控制

  • zhangyunsheng11
  • zhangyunsheng11
  • 2017年10月10日 19:15
  • 76
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程的同步控制
举报原因:
原因补充:

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