Skip to content

Commit fb0bd91

Browse files
committed
Optimized MutexAtomicBoolean
1 parent 8183171 commit fb0bd91

File tree

2 files changed

+74
-63
lines changed

2 files changed

+74
-63
lines changed

lib/concurrent/atomic/atomic_boolean.rb

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class MutexAtomicBoolean
1616
#
1717
# @param [Boolean] init the initial value
1818
def initialize(initial = false)
19-
@value = !! initial
19+
@value = !!initial
2020
@mutex = Mutex.new
2121
end
2222

@@ -26,7 +26,10 @@ def initialize(initial = false)
2626
#
2727
# @return [Boolean] the current value
2828
def value
29-
@mutex.synchronize{ @value }
29+
@mutex.lock
30+
result = @value
31+
@mutex.unlock
32+
result
3033
end
3134

3235
# @!macro [attach] atomic_boolean_method_value_eq
@@ -37,7 +40,11 @@ def value
3740
#
3841
# @return [Boolean] the current value
3942
def value=(value)
40-
@mutex.synchronize{ @value = !! value }
43+
@mutex.lock
44+
@value = !!value
45+
result = @value
46+
@mutex.unlock
47+
result
4148
end
4249

4350
# @!macro [attach] atomic_boolean_method_is_true
@@ -46,7 +53,10 @@ def value=(value)
4653
#
4754
# @return [Boolean] true if the current value is `true`, else false
4855
def true?
49-
@mutex.synchronize{ @value == true }
56+
@mutex.lock
57+
result = @value
58+
@mutex.unlock
59+
result
5060
end
5161

5262
# @!macro [attach] atomic_boolean_method_is_false
@@ -55,27 +65,36 @@ def true?
5565
#
5666
# @return [Boolean] true if the current value is `false`, else false
5767
def false?
58-
@mutex.synchronize{ @value != true }
68+
@mutex.lock
69+
result = !@value
70+
@mutex.unlock
71+
result
5972
end
6073

6174
# @!macro [attach] atomic_boolean_method_make_true
6275
#
6376
# Explicitly sets the value to true.
6477
#
65-
# @return [Boolean] the current value
78+
# @return [Boolean] true if the value changed
6679
def make_true
67-
@mutex.synchronize{ @value = true }
68-
nil
80+
@mutex.lock
81+
old = @value
82+
@value = true
83+
@mutex.unlock
84+
!old
6985
end
7086

7187
# @!macro [attach] atomic_boolean_method_make_false
7288
#
7389
# Explicitly sets the value to false.
7490
#
75-
# @return [Boolean] the current value
91+
# @return [Boolean] true if the value changed
7692
def make_false
77-
@mutex.synchronize{ @value = false }
78-
nil
93+
@mutex.lock
94+
old = @value
95+
@value = false
96+
@mutex.unlock
97+
old
7998
end
8099
end
81100

@@ -87,7 +106,7 @@ class JavaAtomicBoolean
87106
# @!macro atomic_boolean_method_initialize
88107
#
89108
def initialize(initial = false)
90-
@atomic = java.util.concurrent.atomic.AtomicBoolean.new(!! initial)
109+
@atomic = java.util.concurrent.atomic.AtomicBoolean.new(!!initial)
91110
end
92111

93112
# @!macro atomic_boolean_method_value
@@ -99,7 +118,7 @@ def value
99118
# @!macro atomic_boolean_method_value_eq
100119
#
101120
def value=(value)
102-
@atomic.set(!! value)
121+
@atomic.set(!!value)
103122
end
104123

105124
# @!macro [attach] atomic_boolean_method_is_true

spec/concurrent/atomic/atomic_boolean_spec.rb

Lines changed: 42 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
share_examples_for :atomic_boolean do
44

5-
context 'construction' do
5+
describe 'construction' do
66

77
it 'sets the initial value' do
88
described_class.new(true).value.should be_true
@@ -21,7 +21,7 @@
2121
end
2222
end
2323

24-
context '#value' do
24+
describe '#value' do
2525

2626
it 'returns the current value' do
2727
counter = described_class.new(true)
@@ -33,7 +33,7 @@
3333
end
3434
end
3535

36-
context '#value=' do
36+
describe '#value=' do
3737

3838
it 'sets the #value to the given `Boolean`' do
3939
atomic = described_class.new(true)
@@ -59,46 +59,46 @@
5959
end
6060
end
6161

62-
context 'true?' do
62+
describe '#true?' do
6363

6464
specify { described_class.new(true).true?.should be_true }
6565

6666
specify { described_class.new(false).true?.should be_false }
6767
end
6868

69-
context 'false?' do
69+
describe '#false?' do
7070

7171
specify { described_class.new(true).false?.should be_false }
7272

7373
specify { described_class.new(false).false?.should be_true }
7474
end
7575

76-
context 'make_true' do
76+
describe '#make_true' do
7777

78-
it 'makes a false value true and returns nil' do
78+
it 'makes a false value true and returns true' do
7979
subject = described_class.new(false)
80-
subject.make_true.should be_nil
80+
subject.make_true.should be_true
8181
subject.value.should be_true
8282
end
8383

84-
it 'keeps a true value true and returns nil' do
84+
it 'keeps a true value true and returns false' do
8585
subject = described_class.new(true)
86-
subject.make_true.should be_nil
86+
subject.make_true.should be_false
8787
subject.value.should be_true
8888
end
8989
end
9090

91-
context 'make_false' do
91+
describe '#make_false' do
9292

93-
it 'makes a true value false and returns nil' do
93+
it 'makes a true value false and returns true' do
9494
subject = described_class.new(true)
95-
subject.make_false.should be_nil
95+
subject.make_false.should be_true
9696
subject.value.should be_false
9797
end
9898

99-
it 'keeps a false value false and returns nil' do
99+
it 'keeps a false value false and returns false' do
100100
subject = described_class.new(false)
101-
subject.make_false.should be_nil
101+
subject.make_false.should be_false
102102
subject.value.should be_false
103103
end
104104
end
@@ -116,46 +116,38 @@ module Concurrent
116116
described_class.new
117117
end
118118

119-
specify 'value is synchronized' do
120-
mutex = double('mutex')
121-
Mutex.stub(:new).with(no_args).and_return(mutex)
122-
mutex.should_receive(:synchronize)
123-
described_class.new.value
124-
end
119+
context 'instance methods' do
125120

126-
specify 'value= is synchronized' do
127-
mutex = double('mutex')
128-
Mutex.stub(:new).with(no_args).and_return(mutex)
129-
mutex.should_receive(:synchronize)
130-
described_class.new.value = 10
131-
end
121+
before(:each) do
122+
mutex = double('mutex')
123+
Mutex.stub(:new).with(no_args).and_return(mutex)
124+
mutex.should_receive(:lock)
125+
mutex.should_receive(:unlock)
126+
end
132127

133-
specify 'true? is synchronized' do
134-
mutex = double('mutex')
135-
Mutex.stub(:new).with(no_args).and_return(mutex)
136-
mutex.should_receive(:synchronize)
137-
described_class.new.true?
138-
end
128+
specify 'value is synchronized' do
129+
described_class.new.value
130+
end
139131

140-
specify 'false? is synchronized' do
141-
mutex = double('mutex')
142-
Mutex.stub(:new).with(no_args).and_return(mutex)
143-
mutex.should_receive(:synchronize)
144-
described_class.new.false?
145-
end
132+
specify 'value= is synchronized' do
133+
described_class.new.value = 10
134+
end
146135

147-
specify 'make_true is synchronized' do
148-
mutex = double('mutex')
149-
Mutex.stub(:new).with(no_args).and_return(mutex)
150-
mutex.should_receive(:synchronize)
151-
described_class.new.make_true
152-
end
136+
specify 'true? is synchronized' do
137+
described_class.new.true?
138+
end
153139

154-
specify 'make_false is synchronized' do
155-
mutex = double('mutex')
156-
Mutex.stub(:new).with(no_args).and_return(mutex)
157-
mutex.should_receive(:synchronize)
158-
described_class.new.make_false
140+
specify 'false? is synchronized' do
141+
described_class.new.false?
142+
end
143+
144+
specify 'make_true is synchronized' do
145+
described_class.new.make_true
146+
end
147+
148+
specify 'make_false is synchronized' do
149+
described_class.new.make_false
150+
end
159151
end
160152
end
161153

0 commit comments

Comments
 (0)