Nguyên tử - Hướng dẫn nhanh
Nguyên tử
Atomics là một đối tượng trong JavaScript cung cấp các hoạt động nguyên tử được thực hiện như các phương thức tĩnh. Cũng giống như các method của đối tượng Math, các method và thuộc tính của Atomics cũng là static. Nguyên tử được sử dụng với các đối tượng SharedArrayBuffer.
Các hoạt động nguyên tử được cài đặt trên Mô-đun nguyên tử. Không giống như các đối tượng toàn cục khác, Atomics không phải là một phương thức khởi tạo. Nguyên tử không thể được sử dụng với một toán tử mới hoặc có thể được gọi như một hàm.
Hoạt động nguyên tử
Các hoạt động nguyên tử là không thể gián đoạn.
Khi bộ nhớ được chia sẻ, nhiều luồng có thể đọc hoặc ghi một dữ liệu tồn tại trong bộ nhớ. Vì vậy, nếu bất kỳ dữ liệu nào bị thay đổi, sẽ có mất mát dữ liệu Các hoạt động nguyên tử đảm bảo rằng các giá trị dự đoán (dữ liệu) được ghi và đọc chính xác. Các hoạt động nguyên tử sẽ không bắt đầu cho đến khi và trừ khi hoạt động hiện tại kết thúc, vì vậy không có cách nào để thay đổi dữ liệu hiện có.
Thí dụ
Sau đây là đoạn mã thể hiện việc sử dụng JavaScript Atomics Operation -
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.add(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
Nguyên tử
Atomics là một đối tượng trong JavaScript cung cấp các hoạt động nguyên tử được thực hiện như các phương thức tĩnh. Cũng giống như các method của đối tượng Math, các method và thuộc tính của Atomics cũng là static. Nguyên tử được sử dụng với các đối tượng SharedArrayBuffer.
Các hoạt động nguyên tử được cài đặt trên Mô-đun nguyên tử. Không giống như các đối tượng toàn cục khác, Atomics không phải là một phương thức khởi tạo. Nguyên tử không thể được sử dụng với một toán tử mới hoặc có thể được gọi như một hàm.
Hoạt động nguyên tử
Các hoạt động nguyên tử là không thể gián đoạn.
Khi bộ nhớ được chia sẻ, nhiều luồng có thể đọc hoặc ghi một dữ liệu tồn tại trong bộ nhớ. Vì vậy, nếu bất kỳ dữ liệu nào bị thay đổi, sẽ có mất mát dữ liệu Các hoạt động nguyên tử đảm bảo rằng các giá trị dự đoán (dữ liệu) được ghi và đọc chính xác. Các hoạt động nguyên tử sẽ không bắt đầu cho đến khi và trừ khi hoạt động hiện tại kết thúc, vì vậy không có cách nào để thay đổi dữ liệu hiện có.
Thí dụ
Sau đây là đoạn mã thể hiện việc sử dụng JavaScript Atomics Operation -
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.add(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
addphương thức thêm một giá trị đã cho tại một vị trí nhất định trong mảng. Nó trả về giá trị cũ tại vị trí đó. Hoạt động nguyên tử này đảm bảo rằng không có lần ghi nào khác có thể xảy ra cho đến khi giá trị đã sửa đổi được ghi lại.
Cú pháp
Atomics.add(typedArray, index, value)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ.
value được thêm vào.
Trở về
Trả về giá trị cũ ở vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.add(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
andphương thức tính toán bitwise AND với một giá trị đã cho tại một vị trí nhất định trong mảng. Nó trả về giá trị cũ tại vị trí đó. Hoạt động nguyên tử này đảm bảo rằng không có lần ghi nào khác có thể xảy ra cho đến khi giá trị đã sửa đổi được ghi lại.
Cú pháp
Atomics.and(typedArray, index, value)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ.
value với bitwise AND được tính toán.
Trở về
Trả về giá trị cũ ở vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.and(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
//6 & 2 = 110 & 010 = 010 = 2
container.innerHTML = Atomics.and(arr, 0, 2) + '<br/>'+ Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
compareExchangephương pháp so sánh và trao đổi giá trị thay thế nếu giá trị đã cho không giống với giá trị cũ. Nó trả về giá trị cũ tại vị trí đó. Hoạt động nguyên tử này đảm bảo rằng không có lần ghi nào khác có thể xảy ra cho đến khi giá trị đã sửa đổi được ghi lại.
Cú pháp
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ.
expectedValue để kiểm tra sự bình đẳng.
replacementValue trao đổi.
Trở về
Trả về giá trị cũ ở vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.compareExchange(arr, 0, 6, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
container.innerHTML = Atomics.compareExchange(arr, 0, 6, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
exchangephương thức trao đổi một giá trị nhất định tại vị trí nhất định của một mảng. Nó trả về giá trị cũ tại vị trí đó. Hoạt động nguyên tử này đảm bảo rằng không có lần ghi nào khác có thể xảy ra cho đến khi giá trị đã sửa đổi được ghi lại.
Cú pháp
Atomics.exchange(typedArray, index, value)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ.
value trao đổi.
Trở về
Trả về giá trị cũ ở vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.exchange(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
container.innerHTML = Atomics.exchange(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
isLockFreephương pháp được sử dụng để xác định xem khóa có được sử dụng hay không cho các hoạt động nguyên tử. Nếu kích thước đã cho là một trong các thuộc tính TypedArray.BYTES_PER_ELEMENT của các loại TypedArray số nguyên thì nó trả về true. TypedArray.BYTES_PER_ELEMENT biểu thị kích thước tính bằng byte của mỗi phần tử của một mảng đã nhập.
Cú pháp
Atomics.isLockFree(size)
Thông số
size để được kiểm tra theo byte.
Trở về
Trả về true nếu thao tác không khóa là false.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.isLockFree(1)</p>
<p>Atomics.isLockFree(3)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
// Int8Array.BYTES_PER_ELEMENT = 1
container.innerHTML = Atomics.isLockFree(Int8Array.BYTES_PER_ELEMENT) + '<br/>' + Atomics.isLockFree(3);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
load phương thức trả về một giá trị tại vị trí đã cho trong mảng.
Cú pháp
Atomics.load(typedArray, index)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ.
Trở về
Trả về giá trị ở vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.add(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
notifyphương thức thông báo cho tác nhân đang chờ đánh thức. Phương thức thông báo chỉ có thể hoạt động với Int32Array được tạo bằng SharedArrayBuffer. Nó trả về 0 trong trường hợp đối tượng ArrayBuffer không được chia sẻ được sử dụng.
Cú pháp
Atomics.notify(typedArray, index, count)
Thông số
typedArray là một Int32Array được chia sẻ.
index là vị trí trong khay gõ để đánh thức.
count là số lượng tác nhân ngủ cần thông báo.
Trở về
Trả về số lượng nhân viên đã đánh thức.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.store(arr, 0, 5)</p>
<p>Atomics.notify(arr, 0, 1)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(16);
var arr = new Int32Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
container.innerHTML = Atomics.store(arr, 0, 5) + '<br>' + Atomics.notify(arr, 0, 1);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
orphương thức tính toán theo bitwise OR với một giá trị đã cho tại một vị trí nhất định trong mảng. Nó trả về giá trị cũ tại vị trí đó. Hoạt động nguyên tử này đảm bảo rằng không có lần ghi nào khác có thể xảy ra cho đến khi giá trị đã sửa đổi được ghi lại.
Cú pháp
Atomics.or(typedArray, index, value)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ.
value với bitwise HOẶC được tính toán.
Trở về
Trả về giá trị cũ ở vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.or(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
//6 | 2 = 110 | 010 = 110 = 6
container.innerHTML = Atomics.or(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
storephương thức lưu trữ một giá trị tại vị trí đã cho trong một mảng và trả về giá trị tương tự. Hoạt động nguyên tử này đảm bảo rằng không có lần ghi nào khác có thể xảy ra cho đến khi giá trị đã sửa đổi được ghi lại.
Cú pháp
Atomics.store(typedArray, index, value)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ nơi giá trị được lưu trữ.
value Được lưu trữ.
Trở về
Trả về giá trị được lưu trữ tại vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.store(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
container.innerHTML = Atomics.store(arr, 0, 2) + '<br/>'
+ Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
subphương thức trừ một giá trị đã cho tại một vị trí nhất định trong mảng. Nó trả về giá trị cũ tại vị trí đó. Hoạt động nguyên tử này đảm bảo rằng không có lần ghi nào khác có thể xảy ra cho đến khi giá trị đã sửa đổi được ghi lại.
Cú pháp
Atomics.sub(typedArray, index, value)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ.
value được trừ.
Trở về
Trả về giá trị cũ ở vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.sub(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
//6 - 2 = 4
container.innerHTML = Atomics.sub(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.
xorphương thức tính toán bitwise XOR với một giá trị đã cho tại một vị trí nhất định trong mảng. Nó trả về giá trị cũ tại vị trí đó. Hoạt động nguyên tử này đảm bảo rằng không có lần ghi nào khác có thể xảy ra cho đến khi giá trị đã sửa đổi được ghi lại.
Cú pháp
Atomics.xor(typedArray, index, value)
Thông số
typedArray là mảng được nhập kiểu số nguyên.
index là vị trí trong khay gõ.
value với XOR theo từng bit sẽ được tính.
Trở về
Trả về giá trị cũ ở vị trí đã cho.
Ngoại lệ
TypeError trong trường hợp mảng được truyền không phải là mảng được nhập số nguyên.
RangeError nếu chỉ mục được truyền ra ngoài bị ràng buộc trong mảng đã nhập.
Thí dụ
Sau đây là mã để triển khai JavaScript Atomics:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Atomics Example</title>
<style>
.result {
font-size: 20px;
border: 1px solid black;
}
</style>
</head>
<body onLoad="operate();">
<h1>JavaScript Atomics Properties</h1>
<div class="result"></div>
<p>Atomics.xor(arr, 0, 2)</p>
<p>Atomics.load(arr, 0)</p>
<script>
function operate(){
let container = document.querySelector(".result");
// create a SharedArrayBuffer
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// Initialise element at zeroth position of array with 6
arr[0] = 6;
//6 xor 2 = 110 xor 010 = 100 = 4
container.innerHTML = Atomics.xor(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
}
</script>
</body>
</html>
Đầu ra
Xác minh kết quả.