Atomic Java là gì

Atomic variable

Brian

Apr 26, 2019·2 min read

Hi guyssssss

Dạo gần đây mình hay đọc code một ít code của Android nói chung, và Java nói riêng. Mình nhận ra một thứ khá tiện lợi của Java mà bên Swift không có sẵn đó là Atomic Variable như: AtomicBoolean, AtomicDouble, . Thật ra cái này cũng chẳng có gì cao siêu, nhưng cảm thấy cũng khá tiện lợi trong một số trường hợp nên mình quyết định làm cho Swift, và để tăng tính reuse thì mình viết một generic struct như sau:

struct Atomic {
private var _value: T
init[_ v: T] { // }
}

Vậy thì trước tiên, Atomic là gì, một variable gọi là atomic khi và chỉ khi có một thread duy nhất làm việc với variable đó tại một thời điểm.

Cũng có nghĩa là khi thread này đang sử dụng var đó thì thread khác phải chờ.

Trong iOS cũng ta cũng có sẵn một attribute dành cho @property cùng tên là atomic. Đây là default khi declare một property trong Objective-C và non-atomic là default của property trong Swift.

@property [atomic] NSObject *obj;

Chúng ta đã biết định nghĩa của Atomic, vậy làm sao để chỉ cho 1 thread access variables tại một thời điểm. Có một số cách để implement cái này nhưng phổ biến nhất là sử dụng lock hay mutex. Cách sài mutex khá phổ biến là sử dụng pthread API [POSIX], một low-level API, nhưng khi viết chung với Swift nhìn chả ăn nhập gì. Nói chung là nhìn XẤU :D Nên cách mình hay sử dụng là semaphore [GCD] với với limit là 1.

let mutex = DispatchSemaphore[value: 1]

Một số APIs khác như: NSLock, @synchronized trong Objective-C, hay cặp objc_sync_enter objc_sync_exit trong Swift, hoặc có thể sử dụng serial queue [GCD] hay concurrent queue và sài dispatch_barrier :]]] Và bài cuối là OperationQueue với maxConcurrent = 1 :3 Nói chung nhiều cách, tuỳ vào sở thích :D

Và cuối cùng để làm một cái gì đó nhìn giống direct assign thì mình tạo ra một custom operator

infix operator

Chủ Đề