11.5.1 线程间的数据共享
Java的多线程机制使多个线程共享数据成为可能。例如,将对银行账户的存款、取款操作分别设计成线程,存款线程与取款线程能够对同一个账户数据进行操作,此时该账户数据成为共享数据。下面我们通过例11-5来看线程间如何共享数据。
【例11-5】银行账户的存取款线程设计。
设计思路:本例设计三个类:银行账户类BankAcconut1、存款线程类SaveMoney1和取款线程类FetchMoney1。
其中银行账户类BankAcconut1中设有私有变量value用于记录金额,put()方法存款,get()方法取款。
存款线程类SaveMoney1与取款线程类FetchMoney1的操作类似,对于给定账户u1创建一个线程对象。线程体run()中,首先查看账户上现有金额,再存(取)款,其间的sleep表示所花费的时间。
main()方法中,对于同一个账户u1同时进行三次存(取)款操作。程序如下:
程序运行结果如下:
【程序说明】本例说明多个线程能够共享数据,但对同一数据进行操作时,出现并发执行问题,导致结果不正确。
那么如何保证数据的完整性和一致性呢?本例的关键是多个线程应该能够且必须能够对同一个数据进行操作,但这种操作必须是有序的,必须有一种机制,保证在任何时刻只能有一个线程对一个数据进行操作。这就是同步机制,在Java中使用关键字synchronized来实现。