除了使用synchronized关键字之外,如何在java中同步方法?
答案 0 :(得分:6)
您可以使用java.util.concurrent.locks
包,尤其是Lock界面:
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock();
}
请参阅here。
答案 1 :(得分:2)
取决于您的具体需求。
有关更高级别的同步抽象,请参阅Java concurrent package。请注意,他们仍然可以在...下面使用synchronized
答案 2 :(得分:1)
您可以使用java.util.concurrent.locks包中提供的Lock类
请参阅http://download.oracle.com/javase/1.5.0/docs/api/index.html?java/util/concurrent/locks/Lock.html
答案 3 :(得分:1)
这取决于你想要做什么。您是出于好奇还是有特定原因?
如果您正在尝试加速多线程方法,请尝试同步或锁定特定部分,或完全避免线程问题;制作共享数据final
,制作静态(非共享)数据ThreadLocal
,使用java.util.concurrent.atomic
中的原子类型,使用并发集合(来自java.util.concurrent
包)等。
顺便说一下,java.util.concurrent
内容仅在Java5以后可用,但有一个项目在http://backport-jsr166.sourceforge.net/
我推荐Brian Goetz撰写的“Java Concurrency in Practice”一书。
答案 4 :(得分:1)
您还可以使用@Synchronized中的Project Lombok生成一个私有字段,该字段将用作您方法的锁定。
答案 5 :(得分:0)
您可以在方法中使用synchronized块。如果您希望单独同步属于同一类的两个方法,这将非常有用。
private Object guard = new ...
public method(){
synchronized(guard){
\\method body
...
}
}
虽然在大多数情况下这表明你应该真的打破你的课程。