并发模式在解决线程冲突问题的时候,一般采用序列化访问资源的方案。这意味着在给定时刻只允许一个任务访问共享资源。通常是通过在代码前面加上一条锁语句来实现的。这就使得在一段时间内只有一个任务可以运行这段代码
关键字synchronized为防止资源冲突提供了内置支持。当任务要执行被synchronized关键字保护的代码段时,它将检查锁是否可用,然后获取锁,执行代码,释放锁。
要控制对共享资源的访问,得先把它包装进一个对象,然后把所有要访问这个资源的方法都标记为synchronized。如果某个任务处于一个对标记为synchronized的方法的调用中,那么在这个线程从该方法返回之前,其它所有要调用这个类中任何标记为synchronized方法的线程都会被阻塞。所有对象都自动地含有单一的锁(监视器)。当在对象上调用任意synchronized方法时,此对象被加锁,这时该对象上的其他synchronized方法只有等到前一个方法调用完毕并释放了锁之后才能被调用。即对某个特定对象而言,其所有的synchronized方法共享一个锁,这可以被用来防止多个任务同时访问被编码对象内存。
在使用并发时将域设置为private是非常重要的,否则synchronized就不能防止其他任务直接访问域,这样就会产生冲突。如果在你的类中有超过一个方法在处理临界数据,那么你必须同步所有相关方法。如果只同步一个方法,其他方法就会随意地忽略这个对象锁,并可以在无任何惩罚的情况下被调用:即每个访问临界共享资源的方法都必须被同步,否则不能正确地工作。
|