并发同步与锁

1.一个生产者和一个消费者。

存在资源竞争情况:1).生产者和消费者同时访问fuilt store,当时fuilt store库存为0时,生产者生产一个产品,但未修改库存数量时,消费者这时访问fuilt store发现库存数量为0,无法购买产品;当fuilt store库存为100时,消费者购买一个产品后,未来得及修改库存数量,生产者这时访问fuilt store发现库存满了,不在生产产品。

这种资源竞争的情况,还不算糟糕,虽然造成了某一次的判断错误,但并没有影响整体业务功能。

class  FuiltStore {
	public int curFuiltNum = 0;
	public boolean increase()
	{
		if (curFuiltNum < 100) {
		    this.curFuiltNum++;
		    return true;
		}
		return false;
	}
	public boolean decrease()
	{
		if (curFuiltNum > 0) {
		    this.curFuiltNum--;
		    return true;
		}
		return false;
	}
}

class FuiltWorkerTom implements Runnable{
	private FuiltStore fuiltStore;
	private int stockNum = 0;
	public FuiltWorkerTom(FuiltStore fuiltStore)
	{
		this.fuiltStore = fuiltStore;
	}
	public boolean stockFuilt() {
		if (this.fuiltStore.increase())
		{
			System.out.println("stock");
			return true;
		}
		return false;
	}
	@Override
	public void run() {
		while (this.stockNum < 100) {
			if (this.stockFuilt()) {
				this.stockNum++;
				Thread.yield();
			}
		}
	}
}
class FuiltBuyerMary implements Runnable{
	private FuiltStore fuiltStore;
	private int buyNum = 0;
	public FuiltBuyerMary(FuiltStore fuiltStore)
	{
		this.fuiltStore = fuiltStore;
	}
	public boolean buyFuilt() {
		if (this.fuiltStore.decrease()) {
			System.out.println("buy");
			return true;
		}
		return false;
	}
	@Override
	public void run() {
		while (this.buyNum < 100) {
			if (this.buyFuilt()) {
				this.buyNum++;
			    Thread.yield();
			}
		}
	}
}
public class MainThread {

	public static void main(String[] args) {
		FuiltStore fuiltStore = new FuiltStore();
        Thread fuiltWorkerTom = new Thread(new FuiltWorkerTom(fuiltStore));
        fuiltWorkerTom.start();
        Thread fuiltBuyerMary = new Thread(new FuiltBuyerMary(fuiltStore));
        fuiltBuyerMary.start();
        try {
			fuiltWorkerTom.join();
	        fuiltBuyerMary.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        System.out.println(fuiltStore.curFuiltNum);
	}

}

时间: 2024-10-15 20:46:46

并发同步与锁的相关文章

数据量下高并发同步的讲解(不看,保证你后悔

4.常见的提高高并发下访问的效率的手段 首先要了解高并发的的瓶颈在哪里? 1.可能是服务器网络带宽不够 2.可能web线程连接数不够 3.可能数据库连接查询上不去. 根据不同的情况,解决思路也不同. 像第一种情况可以增加网络带宽,DNS域名解析分发多台服务器. 负载均衡,前置代理服务器nginx.apache等等 数据库查询优化,读写分离,分表等等 最后复制一些在高并发下面需要常常需要处理的内容: 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能.

java多线程并发系列之锁的深入了解

上一篇博客中 : java多线程.并发系列之 (synchronized)同步与加锁机制 .介绍了java中Synchronized和简单的加锁机制,在加锁的模块中介绍了 轮询锁和定时锁,简单回顾下 轮询锁:利用tryLock来获取两个锁,如果不能同时获得,那么回退并重新尝试. 定时锁:索取锁的时候可以设定一个超时时间,如果超过这个时间还没索取到锁,则不会继续堵塞而是放弃此次任务. 锁的公平性 在公平的锁上,线程将按照它们发出请求的顺序来获取锁 上面似乎忘记了还有一种可中断锁和可选择粒度锁 可中

Java线程:线程的同步与锁

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public class Foo {     private int x = 100; public int getX() {         return x;     } public int fix(int y) {         x = x - y;         return x;     } }

Java并发编程:锁的释放

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

大数据量下高并发同步的讲解

对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧. 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1.同步和异步的区别和联系         所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到 返回的值或消息后才往下执行其它的命令. 异步,

大数据量下高并发同步的讲解(转)

文章转自:http://blog.csdn.net/xcw931924821/article/details/52475742 *************************************************************************************************************************************************************************************** 对于

MySQL系列:innodb引擎分析之线程并发同步机制

innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比较高效的并发同步机制.innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进行自己的封装和实现优化,但是也兼容系统的锁.我们先看一段innodb内部的注释(MySQL-3.23): Semaphore operations in operating systems are slow: Solaris on a 1993 Sparc takes 3 microseconds (

线程同步与锁

二元信号量,多元信号量,互斥量,临界区.其它包括读写锁,条件变量. -1:二元信号量,适合与只能被一个线程独占访问的资源.当二元信号量处于非占用状态时,第一个试图获取该二元信号量的线程会获得该锁,并将二元信号量重置为占用状态,在未释放该锁前,其它所有试图获取该二元信号量的线程将会等待. -2:多元信号量,简称信号量.一个初始值为N的信号量允许N个线程并发访问. 获取该信号量时,信号量的值减一,当信号量的值小于0时,再来获取信号量的线程进入等待状态. 释放该信号量时,信号量的值加一,当信号量的值大

大数据量下高并发同步的讲解(不看,保证你后悔)

对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧. 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1.同步和异步的区别和联系          所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到 返回的值或消息后才往下执行其它的命令. 异步