Java 允许同时进行两次访问的同步方法
我有以下方法Java 允许同时进行两次访问的同步方法,java,multithreading,Java,Multithreading,我有以下方法 public synchronized void run() { while (done.get()!=true) { System.out.println(">>> Golfer #"+ myID + " trying to fill bucket with "+getBallsPerBucket()+" balls."); golferBucket = sharedStash.getBucketBalls();
public synchronized void run()
{
while (done.get()!=true) {
System.out.println(">>> Golfer #"+ myID + " trying to fill bucket with "+getBallsPerBucket()+" balls.");
golferBucket = sharedStash.getBucketBalls();
if(golferBucket.length == 0){
try {
sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Golfer.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println("<<< Golfer #"+ myID + " filled bucket with "+getBallsPerBucket()+" balls, size = "+sharedStash.getSizeStash());
public synchronized void run()
{
while(done.get()!=true){
System.out.println(“>>>Golfer#”+myID+”试图用“+getBallsPerBucket()+”balls.”填充桶;
golferBucket=sharedStash.getBucketball();
如果(golferBucket.length==0){
试一试{
睡眠(1000);
}捕获(中断异常例外){
Logger.getLogger(Golfer.class.getName()).log(Level.SEVERE,null,ex);
}
}
您现有的方法不起作用。在一篇评论中,您声明您的方法在不同的类中
如果这两个方法在不同的类中,在方法定义中使用synchronized关键字将没有帮助。在方法定义中使用synchronized时,synchronized等同于在类定义上同步
这:
相当于:
public class MyClass{
public void aMethod(){
synchronized(this){
// do stuff
}
}
}
这意味着run()方法和getBucketBalls()没有使用同一个对象来控制访问。如果它们没有在同一个对象上同步,则没有任何东西可以阻止它们同时运行
如果要同步两个不同类中的方法,则需要创建一个对象,它们都可以用作锁,例如:
Object lockObj = new Object();
public void aMethod(){
synchronized(lockObj){
// do stuff
}
}
lockObj可以是任何对象,所以在您的情况下
public void run(){
synchronized(ballStash){
// do work
}
}
public void getBucketBalls(){
synchronized(ballStash){
// do work
}
}
请提供一个MCVE。哦,我明白了,我添加了示例输出,线程都说它们的线程大小为10,但应该说是15然后是10,我得到的输出没有意义,因为一个线程应该先执行,然后值为15,而不是10。当在方法定义中使用时,synchronized会导致在clas上获取锁在方法执行之前拥有该方法的。您的两个方法在同一个类中吗?不,第一个run()方法在Golfer类中,第二个getBucketBalls()在BallStash类中。它们应该在同一个类中吗?那么我如何将其用于run()呢方法?这个解释没有任何意义。如果这两个方法在不同的类中,在方法定义中使用synchronized关键字没有帮助。
您的意思是,不能添加方法级同步以防止两个外部类同时访问该方法?线程级同步当多个线程试图访问同一方法时,该方法可以正常工作。如果同一对象对多个线程可见,则方法级同步足以防止并发访问。@TechTrip您能帮我吗?我需要一个完整的上下文示例。@TechTrip-我的示例的第一部分是演示为什么Daniel的方法行不通。他说他的方法在不同的类中。
public class MyClass{
public void aMethod(){
synchronized(this){
// do stuff
}
}
}
Object lockObj = new Object();
public void aMethod(){
synchronized(lockObj){
// do stuff
}
}
public void run(){
synchronized(ballStash){
// do work
}
}
public void getBucketBalls(){
synchronized(ballStash){
// do work
}
}