Java 同时使用两个线程访问两个同步块

Java 同时使用两个线程访问两个同步块,java,multithreading,synchronized,Java,Multithreading,Synchronized,谁能告诉我如何用2个线程同时访问一个方法,这个方法有2个参数和2个同步块。我想要的是,一个线程执行第一个同步块,另一个线程执行第二个同步块 public class myThread{ public static class TwoSums implements Runnable{ private int sum1 = 0; private int sum2 = 0; public void add(int a, int b){ synchronize

谁能告诉我如何用2个线程同时访问一个方法,这个方法有2个参数和2个同步块。我想要的是,一个线程执行第一个同步块,另一个线程执行第二个同步块

public class myThread{

public static class TwoSums implements Runnable{
    private int sum1 = 0;
    private int sum2 = 0;

    public void add(int a, int b){
        synchronized(this){
            sum1 += a;
            String name = Thread.currentThread().getName();
            System.out.println("Thread name that was accessing this code 1  : "+name);
        }

        synchronized(this){
            sum2 += b;
            String name = Thread.currentThread().getName();
            System.out.println("Thread name that was accessing this code 2 : "+name);
        }
    }

    @Override
    public void run() {
        add(10,20);
    }
}

public static void main(String[] args) {
    TwoSums task = new TwoSums();

    Thread t1 = new Thread(task, "Thread 1");
    Thread t2 = new Thread(task, "Thread 2");

    t1.start();
    t2.start();
}
}


此代码包含以下代码:

指令由任何线程按顺序处理,同步块不产生任何异常。下面的代码可以满足您的要求,但看起来只是一个练习,没有任何真正有意义的应用程序

public static class TwoSums implements Runnable {
    private int sum1 = 0;
    private int sum2 = 0;

    public void add(int a, int b) {
        if ("Thread 1".equals(Thread.currentThread().getName())) {
            synchronized (this) {
                sum1 += a;
                String name = Thread.currentThread().getName();
                System.out.println("Thread name that was accessing this code 1  : " + name);
            }
        }
        if ("Thread 2".equals(Thread.currentThread().getName())) {
            synchronized (this) {
                sum2 += b;
                String name = Thread.currentThread().getName();
                System.out.println("Thread name that was accessing this code 2 : " + name);
            }
        }
    }

    @Override
    public void run() {
        add(10, 20);
    }
}

为了实现这一目标,我不打算讨论您所做的是对还是错,因为我假设您只是在学习如何使用ReentranLock接口及其实现锁类:

Lock lock = new ReentrantLock();
您应该在TwoSum类中声明这个对象,并在add方法中使用lock对象。ReentrantLock接口有一个名为tryLock的方法,它将尝试获取调用它的对象的锁,如果成功,它将返回布尔值true,否则返回false。因此,对于第一个线程,它将返回true,但是对于第二个线程,它将返回false。所以你需要做的就是验证

if(lock.tryLock()) //Execute block code 1
else // Execute block code 2

如果不先执行第一个线程,第二个线程就无法到达第二个同步块…将您的方法分为两个不同的方法。这意味着我不能在一个方法中使用两个线程访问两个同步块?您如何直接跳到方法中的第七行?@Okem很容易得到您期望的结果,但要想在Java中实现您想要实现的目标是不可能的。至少就Java而言,您的想法是错误的。