Refactor volatile (#2444)

This commit is contained in:
Grzegorz Piwowarek 2017-08-15 15:17:24 +02:00 committed by GitHub
parent 3b5d9585ed
commit 6db067d2c9
2 changed files with 28 additions and 56 deletions

View File

@ -4,7 +4,7 @@ package com.baeldung.concurrent.volatilekeyword;
public class SharedObject { public class SharedObject {
private volatile int count=0; private volatile int count=0;
public void increamentCount(){ void increamentCount(){
count++; count++;
} }
public int getCount(){ public int getCount(){

View File

@ -8,92 +8,64 @@ import static junit.framework.Assert.assertEquals;
public class SharedObjectManualTest { public class SharedObjectManualTest {
SharedObject sharedObject; private SharedObject sharedObject;
int valueReadByThread2; private int valueReadByThread2;
int valueReadByThread3; private int valueReadByThread3;
@Before @Before
public void setUp(){ public void setUp() {
sharedObject = new SharedObject(); sharedObject = new SharedObject();
} }
@Test @Test
public void whenOneThreadWrites_thenVolatileReadsFromMainMemory() throws InterruptedException { public void whenOneThreadWrites_thenVolatileReadsFromMainMemory() throws InterruptedException {
Thread writer = new Thread(){ Thread writer = new Thread(() -> sharedObject.increamentCount());
public void run(){
sharedObject.increamentCount();
}
};
writer.start(); writer.start();
Thread readerOne = new Thread(){ Thread readerOne = new Thread(() -> {
public void run(){ try {
try { Thread.sleep(1000);
Thread.sleep(1000); } catch (InterruptedException e) {
} catch (InterruptedException e) { e.printStackTrace();
e.printStackTrace();
}
valueReadByThread2= sharedObject.getCount();
} }
}; valueReadByThread2 = sharedObject.getCount();
});
readerOne.start(); readerOne.start();
Thread readerTwo = new Thread(){ Thread readerTwo = new Thread(() -> {
public void run(){ try {
try { Thread.sleep(1000);
Thread.sleep(1000); } catch (InterruptedException e) {
} catch (InterruptedException e) { e.printStackTrace();
e.printStackTrace();
}
valueReadByThread3=sharedObject.getCount();
} }
}; valueReadByThread3 = sharedObject.getCount();
});
readerTwo.start(); readerTwo.start();
assertEquals(1,valueReadByThread2); assertEquals(1, valueReadByThread2);
assertEquals(1,valueReadByThread3); assertEquals(1, valueReadByThread3);
} }
@Test @Test
public void whenTwoThreadWrites_thenVolatileReadsFromMainMemory() throws InterruptedException { public void whenTwoThreadWrites_thenVolatileReadsFromMainMemory() throws InterruptedException {
Thread writerOne = new Thread(){ Thread writerOne = new Thread(() -> sharedObject.increamentCount());
public void run(){
sharedObject.increamentCount();
}
};
writerOne.start(); writerOne.start();
Thread.sleep(100); Thread.sleep(100);
Thread writerTwo = new Thread(){ Thread writerTwo = new Thread(() -> sharedObject.increamentCount());
public void run(){
sharedObject.increamentCount();
}
};
writerTwo.start(); writerTwo.start();
Thread.sleep(100); Thread.sleep(100);
Thread readerOne = new Thread(){ Thread readerOne = new Thread(() -> valueReadByThread2 = sharedObject.getCount());
public void run(){
valueReadByThread2= sharedObject.getCount();
}
};
readerOne.start(); readerOne.start();
Thread readerTwo = new Thread(){ Thread readerTwo = new Thread(() -> valueReadByThread3 = sharedObject.getCount());
public void run(){
valueReadByThread3=sharedObject.getCount();
}
};
readerTwo.start(); readerTwo.start();
assertEquals(2,valueReadByThread2); assertEquals(2, valueReadByThread2);
assertEquals(2,valueReadByThread3); assertEquals(2, valueReadByThread3);
} }
@After
public void cleanup(){
sharedObject = null;
}
} }