Java 共享对象的信令
我无法理解,在哪里放置方法 MySignal类的hasDataToProcess()和setHasDataToProcess() 在App9类中,在NotThreadSafe类型的对象上保持同步 请帮我了解这个地方 //通过共享对象发送信号 代码:Java 共享对象的信令,java,multithreading,Java,Multithreading,我无法理解,在哪里放置方法 MySignal类的hasDataToProcess()和setHasDataToProcess() 在App9类中,在NotThreadSafe类型的对象上保持同步 请帮我了解这个地方 //通过共享对象发送信号 代码: 类MySignal{ 受保护的布尔值hasDataToProcess=false; 公共同步布尔hasDataToProcess(){ 返回this.hasDataToProcess; } 公共同步的void setHasDataToProcess(
类MySignal{
受保护的布尔值hasDataToProcess=false;
公共同步布尔hasDataToProcess(){
返回this.hasDataToProcess;
}
公共同步的void setHasDataToProcess(布尔hasData){
this.hasDataToProcess=true;
}
}
类非线程安全{
StringBuilder=新的StringBuilder();
公共void添加(字符串文本){
this.builder.append(文本);
}
公共空间显示(){
System.out.println(生成器);
}
}
公共类App9扩展了线程{
非线程安全实例;
受保护的MySignal sharedSignal=new MySignal();
公共应用程序9(非线程安全共享状态){
this.instance=sharedInstance;
}
@凌驾
公开募捐{
本.instance.add(“sham”);
this.instance.display();
}
公共静态void main(字符串[]args){
NotThreadSafe sharedInstance=新的NotThreadSafe();
对于(int i=0;在run()中)
方法?您的MySignal
现在可以用volatile boolean
替换。该怎么办?我看不到任何锁或任何有助于保护NotThreadSafe
类的东西。我的目标是在繁忙等待的情况下对NotThreadSafe对象执行同步。例如..protected MySignal sharedSignal=…;而(!sharedSignal.HASDATOTOPROSS()){//什么也不做..忙着等待}
class MySignal{
protected boolean hasDataToProcess = false;
public synchronized boolean hasDataToProcess(){
return this.hasDataToProcess;
}
public synchronized void setHasDataToProcess(boolean hasData){
this.hasDataToProcess = true;
}
}
class NotThreadSafe{
StringBuilder builder = new StringBuilder();
public void add(String text){
this.builder.append(text);
}
public void display(){
System.out.println(builder);
}
}
public class App9 extends Thread {
NotThreadSafe instance;
protected MySignal sharedSignal = new MySignal();
public App9(NotThreadSafe sharedInstance){
this.instance = sharedInstance;
}
@Override
public void run(){
this.instance.add("sham");
this.instance.display();
}
public static void main(String[] args) {
NotThreadSafe sharedInstance = new NotThreadSafe();
for(int i=0; i<10 ; i++){
Thread t = new App9(sharedInstance);
t.start();
}
}
}