标签:协同 draw 线程之间的通信 实现 生产者消费者问题 pool print 同步代码块 变量
在Java中,提供了两种方式来实现同步互斥访问:synchronized和Lock
class Account{ private int balance; private Lock poolLock = new ReentrantLock(); private Condition condition = poolLock.newCondition(); public Account(int balance) { super(); this.balance = balance; } public int getBalance() { return balance; } public void deposit(int money){ poolLock.lock(); try{ this.balance=getBalance() + money; condition.signal(); } finally { poolLock.unlock(); } } public void withdraw(int money){ poolLock.lock(); try{ while (getBalance() <money) { try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } this.balance=getBalance() - money; condition.signal(); } finally{ poolLock.unlock(); } } }
同步方法是在原子操作的程序代码前添加synchronized关键字,
public static synchronized void addld(){ id++; }
同步代码块是在方法中添加synchronized代码块,如:
public static void addld(){ synchronized(Counter.class){//synchronized(syncObject),syncObject==上锁对象 id++; } }
synchronized块其中的代码必须获得对象syncObject(可以是类实例或类)的锁方能执行。
互斥访问的原理:资源配给任务使用时,在其上加锁。如果想访问某项资源的任务必须锁定这种资源,使其他任务无法访问它直至这个资源被解锁,即没有对象锁的对象只能进入Lock pool等待线程结束,然后再和其他对象竞争锁,有锁才能执行,并且一次只允许一个线程使用该资源,直到所有线程结束。
Object的wait()、notify()可以用来实现线程之间的协作,另外还有await()等。 同步访问一般都要放到synchronized方法是为了防止多个线程访问同一资源所引起的冲突。
要有一个标志boolean值来判断执行哪块代码。因为是两个线程交替执行,线程之间需要相互协作,所以使用了wait,notify,还有flag标志机制来实现。getSize()方法返回任务为完成的数量,当所有任务都完成后结束程序。
多运行几次后发现仓库所剩货物不为0:
生产者的生产速度和消费者的取货速度不一致,线程之间没有合作,就出现混乱。
如果代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全。
标签:协同 draw 线程之间的通信 实现 生产者消费者问题 pool print 同步代码块 变量
原文地址:http://www.cnblogs.com/ssssss11/p/6818095.html