![](/img/trans.png)
[英]Does a thread invoking, synchronized method, pre-empt another thread using same object but in a non synchronized manner?
[英]Access synchronized method from another thread using same instance
我在我的項目中有一個核心方法,我需要對其進行synchronized
,以使其不被同時訪問兩次,因此我有一個線程,該線程使用此類中的實例來訪問此方法,但在該線程中我需要使用一個長壽命的循環來訪問具有固定值的相同方法,因此我必須使用另一個線程才能允許第一個線程繼續運行並完成其職責,但是可以肯定的是,該方法不會從第二個線程使用第一個線程中使用的相同實例從第二個線程運行,並且由於某種原因我無法實例化該類中的另一個實例,因為我必須確切地使用該實例,因此如何克服此問題。
下面是將問題翻譯為java的問題:
public class ClassOne {
synchronized public void my_method(int number) {
// Do some Work
}
}
public class ClassTwo {
private void some_method() {
Thread one = new Thread(new Runnable() {
@Override
public void run() {
ClassOne class_one = new ClassOne();
// DO Work
class_one.my_method(0);
run_loop(class_one);
// Complete Work
}
});
one.start();
}
boolean running = true;
private void run_loop(final ClassOne class_one) {
Thread two = new Thread(new Runnable() {
@Override
public void run() {
while (running) {
class_one.my_method(1); // won't run
Thread.sleep(10000);
}
}
});
two.start();
}
}
實際問題概述:
my_method
--->是發送UDP數據包。 two
中run_loop
方法。 放一些可以編譯和工作的東西。 我不明白為什么需要同步此功能。 檢查該程序的輸出...第二個線程僅在第一個線程完成訪問后才訪問此方法(除非您錯過添加一些其他代碼的情況)。
class ClassOne {
int criticalData = 1;
synchronized public void my_method(int number) {
// Do some Work
criticalData *= 31;
System.out.println("Critical data:" + criticalData + "[" + Thread.currentThread().getName() + "]");
}
}
class ClassTwo {boolean running = true;
public void some_method() {
Thread one = new Thread(new Runnable() {
public void run() {
ClassOne class_one = new ClassOne();
// DO Work
class_one.my_method(0);
run_loop(class_one);
// Complete Work
}
});
one.start();
}
public void run_loop(final ClassOne class_one) {
Thread two = new Thread(new Runnable() {
public void run() {
while (running) {
class_one.my_method(1); // won't run
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
two.start();
}
}
public class StackExchangeProblem {
public static void main(String[] args) {
ClassTwo two = new ClassTwo();
two.some_method();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.