首页 理论教育 解决Java程序设计中的同步问题

解决Java程序设计中的同步问题

时间:2023-11-01 理论教育 版权反馈
【摘要】:图6-15多线程操作共享资源带来的问题程序第4行创建了一个Bank Account对象x,无论采用程序第7~8行,还是程序第11~12行创建的线程对象t1和t2,都会涉及操作共享资源Bank Account对象x。图6-16多线程没有访问共享资源两个存钱线程t1和t2分别向不同的Bank Account对象存了2次钱,每次1元,由于没有操作共享资源,因此,两个线程互不影响,不会出现数据破坏问题,也不用考虑线程同步问题。

解决Java程序设计中的同步问题

我们知道,线程是CPU调度的基本单位,但不是资源分配的基本单位。在一个进程中,多个线程共享同一块存储空间,如果一个共享资源被多个线程同时访问,则可能会出现问题。下面通过一个例子加以说明。

【例6-6】

演示共享数据被多个线程同时访问带来的冲突问题。

步骤1:在chapter6工程src文件夹下新建一个cn.linaw.chapter6.demo04包,然后将cn.linaw.chapter6.demo01包里的Bank Account.java拷贝过来。编写一个新的存钱任务Save Money Task3.java,任务是对给定银行账户存2次钱,每次存1元,同时打印银行账户余额,如图6-14所示。

图6-14 新的存钱任务SaveMoneyTask3类

步骤2:编写一个测试方法,创建2个存钱线程,对共享资源(同一对象)进行操作,如图6-15所示。

图6-15 多线程操作共享资源带来的问题(www.xing528.com)

(1)程序第4行创建了一个Bank Account对象x,无论采用程序第7~8行,还是程序第11~12行创建的线程对象t1和t2,都会涉及操作共享资源Bank Account对象x。

(2)两个线程都往同一个银行账户对象x里存了2次钱,每次1元,账户x初始账户余额为0,账户x每次应该增加1元,最终余额应该是4。但是实践证明,多次运行的结果是不确定的,有可能正确,有可能错误,例如本例最后显示余额是3,显然是错误的。

(3)在多线程环境下,如果存在共享数据,并且存在多条语句操作共享数据,那么就可能导致数据破坏。同一个资源,很多线程都想访问,正确的思路应当是每个线程依次访问,等前一个线程操作完退出后,后一个线程再进去访问,就不会破坏数据,这就需要考虑线程的同步问题。

步骤3:同样在多线程环境下,如果多线程未操作同一个对象,那就不需要考虑线程同步,如图6-16所示。

图6-16 多线程没有访问共享资源

两个存钱线程t1和t2分别向不同的Bank Account对象存了2次钱,每次1元,由于没有操作共享资源,因此,两个线程互不影响,不会出现数据破坏问题,也不用考虑线程同步问题。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈