多线程的同步控制

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

多线程之间的同步控制

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

多线程之间的同步控制

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

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

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

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

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

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

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

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

Ruby on Rails 入门之:(19) ruby线程同步控制

在Ruby中,提供三种实现同步的方式,分别是: 1. 通过Mutex类实现线程同步 2. 监管数据交接的Queue类实现线程同步 3. 使用ConditionVariable实现同步...

线程同步控制的几种方式

在多线程对同一个函数进行调用时,如果不控制号锁的机制,往往就会产生数据混乱的情况,我们通常在控制线程的同步问题时,通常采用的方法: 1:使用synchronized进行控制访问。 2:使用Reen...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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