有人能告诉我如何用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();
}
}
此代码包含来自http://tutorials.jenkov.com/java-concurrency/race-conditions-and-critical-sections.html
的一些代码答案 0 :(得分:0)
任何线程都会按顺序处理指令,并且同步块不会发生任何异常。以下代码可以满足您的要求,但看起来只是一个没有任何实际意义的应用程序的练习
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);
}
}
答案 1 :(得分:0)
为了达到这个目标(我不打算讨论你做的是对还是错,因为我认为你只是在学习如何运作)你需要使用ReentranLock接口及其实现Lock类:
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