JAVA实现网络编程之并发编程
? ?我们运行一下发现balance为4或5,这是个错误的结果,如果一个类的对象在多线程程序中导致竞争状态,则称这个类为线程不安全的。所以这个任务是线程不安全的。
三.用同步完善程序
? ?用互斥锁来实现同步,即在一任务开始执行时加锁,执行完毕后释放锁。在释放锁之前其它任务无法执行。同步完全可以避免竞争状态的产生,但有的时候还需要线程之间的相互合作。
? ?然后增加一个向账户提款(Withdraw)的任务,当余额小于取款数时,等待新存入的存款。
? ?Account类添加
? ?private static Lock lock = new ReentrantLock(); ?//创建一个锁
? ?private static Condition newDeposit = lock.newCondition(); ?//实现一个条件
? ??Account类中应用互斥锁的的方法如下
? ? 而客户端连接上服务器后,创建两个IO流
? ? //IO streams
? ? DataOutputStream toServer?= new DataOutputStream(socket.getOutputStream());
? ? DataInputStream fromServer = new DataInputStream(socket.getInputStream());
?即可传输order(菜单选项)和amount
? ? //Send the order, amount to the server
? ? toServer.writeInt(order);
? ? toServer.writeDouble(amount);
? ? toServer.flush();
? ?最后再读取balance
? ?balance = fromServer.readDouble();
?
?