无需登录 数据私有 本地保存

Web Locks API 探索器 - 跨标签页资源协调

93
0
0
0

术语表

Web Locks API
浏览器提供的原生锁管理API,允许Web应用在多个浏览上下文(标签页、iframe、Worker)之间协调对共享资源的访问。通过navigator.locks对象的request()、query()和request()方法实现锁的获取、查询和释放。Web Locks API是解决多标签页数据竞争问题的浏览器原生方案。
独占锁
Exclusive Lock,同一时刻只能被一个浏览上下文持有的锁。当一个标签页持有独占锁时,其他所有试图获取该锁的请求(无论独占还是共享模式)都会被阻塞等待,直到锁被释放。独占锁适用于需要排他性访问的场景,如写入共享数据、执行支付操作等。
共享锁
Shared Lock,允许多个浏览上下文同时持有的锁。共享锁之间不互斥,但共享锁与独占锁互斥——当有标签页持有共享锁时,无法获取独占锁;当有标签页持有独占锁时,无法获取共享锁。共享锁适用于读多写少的场景,允许多个读者同时访问资源。
锁名称
Web Locks通过字符串名称来标识和管理锁。同一名称的锁在整个浏览器中是全局的,无论由哪个标签页、iframe或Worker创建。不同名称的锁互相独立,互不影响。锁名称的命名空间由开发者自行管理,建议使用有意义的命名约定(如域名+资源路径)来避免命名冲突。
ifAvailable
Web Locks request()方法的选项之一。当设置为true时,如果锁当前不可用(已被其他浏览上下文持有),则立即返回false而非阻塞等待。这种模式适用于非关键的尝试性操作,避免阻塞当前页面的执行流程。ifAvailable不会放入锁的等待队列,获取失败后不影响后续的正常锁请求。
steal
Web Locks request()方法的选项之一。当设置为true时,如果锁已被其他浏览上下文持有,会立即终止当前持有者的锁回调并获取锁。被窃取的持有者会在其锁回调中收到AbortError。steal选项应仅在紧急情况下使用,因为强制转移锁可能导致数据不一致。steal不会影响锁的等待队列。
AbortSignal
Web API中用于取消异步操作的信号机制。在Web Locks中,可以将AbortSignal作为request()方法的signal选项传入,当调用AbortController的abort()方法时,锁请求会被取消并抛出AbortError。常用于实现锁获取的超时控制、用户主动取消锁请求等场景。
锁队列
当多个浏览上下文同时请求同一锁时,无法立即获取的请求会进入等待队列(也称许可队列)。队列按照FIFO(先进先出)原则处理等待请求,但具体的调度策略可能因浏览器实现而异。通过navigator.locks.query()可以查看锁的等待队列中有哪些请求正在排队。
跨标签页协调
利用Web Locks API在多个浏览器标签页之间同步和协调操作的能力。例如确保同一用户打开的多个标签页中只有一个在执行关键操作。本工具通过BroadcastChannel配合Web Locks实现跨标签页的锁状态实时同步,方便开发者测试和调试多标签页应用的锁逻辑。
死锁
Deadlock,多线程或多进程编程中的一种状态,两个或多个参与者互相等待对方释放资源,导致所有参与者都无法继续执行。在Web Locks中,死锁通常发生在标签页A持有锁X等待锁Y,同时标签页B持有锁Y等待锁X的情况。Web Locks API本身不提供死锁检测或恢复机制,需要开发者通过合理的锁获取顺序来避免。
navigator.locks.query()
Web Locks API中用于查询当前锁状态的方法。返回一个Promise,解析为一个对象,包含held(当前被持有的锁列表)、pending(等待队列中的锁请求列表)等信息。每个锁条目包含name(锁名称)、mode(锁模式)、owner(持有者信息)、requests(等待队列)等字段。本工具定期调用此方法来更新锁状态监控面板。