Libraryless. Click here for Pure Java version (96L/1K).
1 | import java.lang.invoke.VarHandle; |
2 | import java.lang.invoke.MethodHandles; |
3 | |
4 | // assumes that each set function is called only once |
5 | sclass PairCollector<A, B> { |
6 | volatile A a; |
7 | volatile B b; |
8 | volatile int counter; |
9 | |
10 | // statically get var handles |
11 | private static final VarHandle vhA, vhB, vhCounter; |
12 | static ctex { |
13 | var l = MethodHandles.lookup(); |
14 | vhA = l.findVarHandle(PairCollector.class, "a", O); |
15 | vhB = l.findVarHandle(PairCollector.class, "b", O); |
16 | vhCounter = l.findVarHandle(PairCollector.class, "counter", int.class); |
17 | } |
18 | |
19 | void setA(A a) { this.a = a; incCounter(); } |
20 | void setB(B b) { this.b = b; incCounter(); } |
21 | |
22 | IVF1<A> setterForA() { ret a -> setA(a); } |
23 | IVF1<B> setterForB() { ret b -> setB(b); } |
24 | |
25 | private void incCounter() { |
26 | if (((int) vhCounter.getAndAdd(this, 1))+1 == 2) |
27 | complete(a, b); |
28 | } |
29 | |
30 | // can override or swap |
31 | swappable void complete(A a, B b) {} |
32 | } |
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): elmgxqgtpvxh, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1035562 |
Snippet name: | PairCollector - concurrent collector for 2 objects with overridable & swappable complete() function |
Eternal ID of this version: | #1035562/11 |
Text MD5: | 14311b666f416b8e2cc16bb23f836290 |
Transpilation MD5: | d9bdac352b1794c567bb83f8d576fc77 |
Author: | stefan |
Category: | javax / parallelism |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-06-17 00:26:12 |
Source code size: | 949 bytes / 32 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 168 / 266 |
Version history: | 10 change(s) |
Referenced in: | [show references] |