The Apprentice Challenge
J Strother Moore Department of Computer Sciences University of Texas at Austin
1
The Apprentice Challenge J Strother Moore Department of Computer - - PowerPoint PPT Presentation
The Apprentice Challenge J Strother Moore Department of Computer Sciences University of Texas at Austin 1 A Class Involving Multiple Threads class Container { public int counter; } class Job extends Thread { Container objref; public void
1
class Container { public int counter; } class Job extends Thread { Container objref; public void setref(Container o) {
2
public Job incr () { synchronized(objref) {
return this; } public void run() { for (;;) {incr(); } } }
3
class Apprentice { public static void main(String[] args){ Container container = new Container(); for (;;) {Job job = new Job(); job.setref(container); job.start(); } } }
4
5
6
class Container {public int counter; } class Job extends Thread { Container objref; public void setref(Container o) {objref = o; } public Job incr () { synchronized(objref){
return this; } public void run() { for (;;) {incr(); } } } class Apprentice { public static void main(String[] args){ Container container = new Container(); for (;;) {Job job = new Job(); job.setref(container); job.start(); } } }
7
class Container {public int counter; } class Job extends Thread { Container objref; public void setref(Container o) {objref = o; } public Job incr () { synchronized(objref) {objref.counter = objref.counter + 1; } return this; } public void run() { for (;;) {incr(); } } } class Apprentice { public static void main(String[] args){ Container container = new Container(); Container bogus = new Container(); for (;;) {Job job = new Job(); job.setref(bogus); job.start(); job.setref(container); } } }
8
Heap Thread Table Class Table
Thread 0 Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() for (;;) { Job job = new Job(); job.setref(bogus); job.start(); job.setref(container);}
9
Heap Class Table
Thread 0 −−− −−− container counter: monitor: container counter: monitor:
Thread Table
Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() for (;;) { Job job = new Job(); job.setref(bogus); job.start(); job.setref(container);}
10
Thread Table Class Table
Thread 1 Thread 0 −−− −−− container counter: monitor: container counter: monitor: Job1
Job job = new Job(); Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {
u n s c h e d u l e d
11
Thread Table Class Table
Thread 1 Thread 0 −−− −−− container counter: monitor: container counter: monitor: Job1
Job job = new Job(); Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {
u n s c h e d u l e d
12
Heap Thread Table Class Table
Thread 1 Thread 0 −−− −−− container counter: monitor: container counter: monitor: Job1
Job job = new Job(); Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {
13
Heap Thread Table Class Table
Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1
Job job = new Job(); −−− Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); for (;;) { job.setref(container);}
14
Heap Thread Table Class Table
Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1
Job job = new Job(); Thread 1
Job incr() synchronized(objref) Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) { {objref.counter =
15
Heap Thread Table Class Table
Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1
Job job = new Job(); Thread 1
1
Job incr() synchronized(objref) {objref.counter = Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {
16
Heap Thread Table Class Table
Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1
Job job = new Job(); Thread 1
1
Job incr() synchronized(objref) {objref.counter = Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {
17
Heap Thread Table Class Table
Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1
Job job = new Job(); Thread 1
1
Job incr() synchronized(objref) {objref.counter = Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {
18
Heap Thread Table Class Table
Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job job = new Job(); Thread 1
1
Thread 2 Job1
Job2
Job incr() synchronized(objref) {objref.counter = Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {
19
Heap Thread Table Class Table
Thread 1 Thread 0 1000000 container counter: monitor: container counter: monitor: Thread 1
1
Thread 2 Job1
Job2
Thread 2
Job incr() synchronized(objref) {objref.counter =
Job incr() synchronized(objref) {objref.counter =
20
Heap Thread Table Class Table
Thread 1 Thread 0 1000000 container counter: monitor: container counter: monitor: Thread 1 Thread 2 Job1
Job2
Thread 2
1
Job incr() synchronized(objref) {objref.counter =
Job incr() synchronized(objref) {objref.counter =
21
Heap Thread Table Class Table
Thread 1 Thread 0 1000000 container counter: monitor: container counter: monitor: Thread 1 Thread 2 Job1
Job2
Thread 2
Job incr() synchronized(objref) {objref.counter =
Job incr() synchronized(objref) {objref.counter =
1
22
class Container { public int counter; } class Job extends Thread { Container objref; public void setref(Container o) {objref = o; } public Job incr () { synchronized(objref) {objref.counter = objref.counter + 1; } return this; } public void run() { for (;;) {incr(); } } } class Apprentice { public static void main(String[] args){ Container container = new Container(); for (;;) {Job job = new Job(); job.setref(container); job.start(); } } }
23
24
25