一个process里面所有的threads是共享同一块memory space的, 所以有时候就需要去避免两个threads同时修改一块resource所引起的问题。 Java里引入Synchronized 和 Lock的概念。
1), synchronized method
1
2
3
4
5
| class Myobject{ public synchronized void foo(String name){ ....................................... } } |
2), 一个class多个synchronized 方法:
1
2
3
4
5
6
7
8
| class Myobject{ public synchronized void bar(String name){ 。。。。。。。。。 } public synchronized void foo(String name){ 。。。。。。。。。 } } |
3), Synchronized 和 Static Synchronized
1
2
3
4
5
| class Myobject{ public static synchronized void bar(String name){ 。。。。。。。。。 } } |
4), Synchronized Block
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Myobject{ public void foo(String name){ synchronized ( this ){ 。。。。。。。。。 } } } class Myobject{ private AnotherClass object = new AnotherClass(); public void foo(String name){ synchronized (object){ 。。。。。。。。。 } } } |
5), Locks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Myobject { private Lock lock; public Myobject(){ lock = new ReentrantLock(); } public void foo(){ lock.lock(); ........ lock.unlock(); } } |
和synchronized类似,一个对象在某一个时间只能有一个thread holds the lock。 避免了lock之间的资源被其他thread随意修改。 比较典型的例子是ATM取款存款机。
同时我们也可以用Lock生成各种condition,方便我们进行操作
No comments:
Post a Comment