多个线程同时访问资源
2014-08-15 15:27
197 查看
多个线程同时访问资源,可能发生不同步,或者程序阻塞的现象(即所有的线程都处于wait状态),比如,两个生产者同时生产,两个消费者同时消费:
测试代码:
package test; class Resources { private static Resources mRes = null; private String mName; private boolean mFlag = false; private int mNumber = 1; private Resources() { } public static Resources getInstance() { if (mRes == null) { synchronized (Resources.class) { if (mRes == null) { mRes = new Resources(); } } } return mRes; } public synchronized void set(String name) { //如果已经生成了一个商品,就等待消费者消费 while (mFlag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } mName = name + "--" + mNumber++; System.out.println(Thread.currentThread().getName() + "---------生成者: " + mName ); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } mFlag = true; notifyAll(); } public synchronized void out() { //如果消费了商品后,就等待生产者生成 while (!mFlag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + "消费者: " + mName); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } mFlag = false; notifyAll(); } } class Product implements Runnable{ public void run(){ Resources res = Resources.getInstance(); while (true) res.set("--------------商品----"); } } class Consumer implements Runnable{ public void run(){ Resources res = Resources.getInstance(); while (true) res.out(); } }
测试代码:
public class Main { public static void main(String[] args) { Product p = new Product(); Consumer c = new Consumer(); new Thread(p).start(); new Thread(p).start(); new Thread(c).start(); new Thread(c).start(); } }
相关文章推荐
- 如何确保N个线程可以访问N个资源同时又不导致死锁
- 多线程Demo-Semaphore 控制同时访问资源的线程个数
- Java多线程指定资源可以被多少个线程同时访问
- (C#) 线程操作 - 限制可同时访问某一资源或资源池的线程数。Semaphore 类。Mutex类
- 多个线程可能会试图同时访问某个对象。在多个线程同时争相访问某个对象的同时,如果一个线程修改了资源,有些线程可能会收到无效状态。例如,如果某个线程读取对象的字段,同时另一线程正在修改该字段,则第一个线程可能会收到无效的字段状态。这种情况称为竞用情况。
- (三)线程同步工具集_1---控制线程并发访问一个资源
- 您可能无法使用服务器管理器,如果两个线程同时访问 IIS 管理 IIS 的修补程序
- 自己总结线程并发的访问资源的解决方法
- 把对互斥资源的锁机制访问改为增加一个资源管理线程如何?
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- Java中怎么控制线程访问资源的数量
- NET 中多线程间资源共享与访问
- 线程URL访问网络资源
- NET 中多线程间资源共享与访问
- java Semaphore信号亮-允许多个任务同时访问这个资源--thinking in java21.7.6
- C# 中线程资源访问互斥锁
- 关于Win32 API(VC作为程序设计语言)的创建线程,解决互斥访问临界资源问题
- 【翻译】.NET 中多线程间资源共享与访问(转)
- 进程与线程(四)线程中访问资源的同步
- java线程同步时,不同线程通过不同方法,访问同一资源