多线程的同步控制

原创 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

相关文章推荐

多线程之间的同步控制

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

C#线程编程及同步控制

  • 2008年03月14日 07:22
  • 619KB
  • 下载

Java.util.concurrent包学习(二)线程同步控制相关的类 (

Java.util.concurrent包学习(二)线程同步控制相关的类  (2013-11-12 10:22:44) 转载▼ 标签:  java学习 分...

主线程和子线程的同步控制

一个线程的结束有两种途径,一种是象我们下面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。另外需要说明的是,一个线程不能被多个线程等待,也就是说对一...

Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别

Collections类中提供了多个synchronizedXxx,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题.    正如Java中常用的集合框架推荐使用...
  • sl0007
  • sl0007
  • 2012年10月09日 10:05
  • 719

线程的同步控制synchronized和lock的对比和区别

我们在面试的时候,时常被问到如何保证线程同步已经对共享资源的多线程编程。我们当然用同步代码块,同步方法,又或者是用java提供的锁机制来达到对共享资源变量的同步控制。 那么我们什么时候用synchr...

《Java高并发程序设计》学习 --3.1多线程的团队协作:同步控制

1)synchronized的功能扩展:重入锁 重入锁可以完全替代synchronized关键字。在JDK5.0的早期版本,重入锁的性能远远好于synchronized,但从JDK6.0开始,JDK在...

主线程 和子线程的同步控制

有道面试题  子线程循环10次 然后 主线程 循环100次  如此往复50次  通过主线程和子线程的同步实现 public class Test { public static void m...

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

让我先对同步(synchronous)与异步(asynchronous)做个说明。当程序1调 用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继 续下去,这就是所谓的“synchron...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程的同步控制
举报原因:
原因补充:

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