如何从隔离函数返回隔离变量?Ballerina代码报错咨询
关于Ballerina隔离函数返回隔离变量的问题解答
可以从隔离函数返回隔离变量,但你的代码写法违反了Ballerina的并发安全规则,触发了错误。
你的代码
import ballerina/http; isolated json[] outputIso = []; service on new http:Listener(9090) { isolated resource function get invictScanList() returns json|error { return outputIso; } }
错误信息
invalid access of an 'isolated' variable outside a 'lock' statement(BCE3962)
中文翻译:未在lock语句内访问'isolated'变量,不符合并发安全规则(BCE3962)
问题原因
Ballerina里,isolated变量属于共享可变状态。哪怕是在isolated函数中访问,也必须通过lock语句来保证并发安全——因为多个请求可能同时调用这个资源函数,直接访问会引发竞态条件风险。
修复方案
方案一:用lock块保证访问安全
在访问outputIso时包裹lock块,同时建议返回变量的克隆体,避免外部修改原变量破坏隔离性:import ballerina/http; isolated json[] outputIso = []; service on new http:Listener(9090) { isolated resource function get invictScanList() returns json|error { lock { return outputIso.clone(); } } }方案二:将变量设为不可变(如果无需修改)
如果outputIso不需要被修改,直接声明为final readonly isolated,此时变量不可变,并发访问无风险,无需lock:import ballerina/http; final readonly isolated json[] outputIso = []; service on new http:Listener(9090) { isolated resource function get invictScanList() returns json|error { return outputIso; } }
内容的提问来源于stack exchange,提问作者MOHAMED SABTHAR
相关产品推荐
相关产品推荐

