Threads and Concurrency in Java

Similar documents
Threads and Concurrency in Java: Part 1

Threads and Concurrency in Java: Part 1

Threads and Concurrency in Java: Part 2

Computation Abstractions. Processes vs. Threads. So, What Is a Thread? CMSC 433 Programming Language Technologies and Paradigms Spring 2007

CMSC 132: Object-Oriented Programming II. Threads in Java

Introduction to Java Threads

Multitasking Multitasking allows several activities to occur concurrently on the computer. A distinction is usually made between: Process-based multit

Synchronization synchronization.

Overview. CMSC 330: Organization of Programming Languages. Concurrency. Multiprocessors. Processes vs. Threads. Computation Abstractions

27/04/2012. We re going to build Multithreading Application. Objectives. MultiThreading. Multithreading Applications. What are Threads?

MultiThreading 07/01/2013. Session objectives. Introduction. Introduction. Advanced Java Programming Course

Advanced Java Programming Course. MultiThreading. By Võ Văn Hải Faculty of Information Technologies Industrial University of Ho Chi Minh City

Java Threads. Introduction to Java Threads

JAVA CONCURRENCY FRAMEWORK. Kaushik Kanetkar

Outline of lecture. i219 Software Design Methodology 10. Multithreaded programming. Kazuhiro Ogata (JAIST)

CS11 Java. Fall Lecture 7

Threads and Locks. CSCI 5828: Foundations of Software Engineering Lecture 09 09/22/2015

THREADS AND CONCURRENCY

Multithreaded Programming Part II. CSE 219 Stony Brook University, Department of Computer Science

Programmazione di sistemi multicore

User Space Multithreading. Computer Science, University of Warwick

Threads and Parallelism in Java

CSCD 330 Network Programming

CSCD 330 Network Programming

CSE 332: Data Structures & Parallelism Lecture 17: Shared-Memory Concurrency & Mutual Exclusion. Ruth Anderson Winter 2019

A Sophomoric Introduction to Shared-Memory Parallelism and Concurrency Lecture 4 Shared-Memory Concurrency & Mutual Exclusion

Concurrency & Parallelism. Threads, Concurrency, and Parallelism. Multicore Processors 11/7/17

Concurrent Programming

Threads, Concurrency, and Parallelism

Need for synchronization: If threads comprise parts of our software systems, then they must communicate.

Synchronization in Java

Programming in Parallel COMP755

THREADS & CONCURRENCY

Module - 4 Multi-Threaded Programming

Dealing with Issues for Interprocess Communication

Multi-threading in Java. Jeff HUANG

Quiz on Tuesday April 13. CS 361 Concurrent programming Drexel University Fall 2004 Lecture 4. Java facts and questions. Things to try in Java

Multiple Inheritance. Computer object can be viewed as

CMSC 132: Object-Oriented Programming II

Concurrent Programming using Threads

Operating Systems. Synchronization

THREADS & CONCURRENCY

CMSC 330: Organization of Programming Languages

Concurrent Processes Rab Nawaz Jadoon

7. MULTITHREDED PROGRAMMING

Note: Each loop has 5 iterations in the ThreeLoopTest program.

Animation Part 2: MoveableShape interface & Multithreading

Performance Throughput Utilization of system resources

Week 7. Concurrent Programming: Thread Synchronization. CS 180 Sunil Prabhakar Department of Computer Science Purdue University

COMP 346 WINTER Tutorial 2 SHARED DATA MANIPULATION AND SYNCHRONIZATION

What is a thread anyway?

Java s Implementation of Concurrency, and how to use it in our applications.

CSE332: Data Abstractions Lecture 22: Shared-Memory Concurrency and Mutual Exclusion. Tyler Robison Summer 2010

COMPSCI 230 Threading Week8. Figure 1 Thread status diagram [

Recap. Contents. Reenterancy of synchronized. Explicit Locks: ReentrantLock. Reenterancy of synchronise (ctd) Advanced Thread programming.

CSE 374 Programming Concepts & Tools

Synchronization. CS 475, Spring 2018 Concurrent & Distributed Systems

INF 212 ANALYSIS OF PROG. LANGS CONCURRENCY. Instructors: Crista Lopes Copyright Instructors.

Synchronization I. Jo, Heeseung

Threads. Definitions. Process Creation. Process. Thread Example. Thread. From Volume II

Question Points Score Total 100

Concurrency. Fundamentals of Computer Science

Java Threads. COMP 585 Noteset #2 1

Parallel Programming: Background Information

Parallel Programming: Background Information

Introducing Shared-Memory Concurrency

Overview. Processes vs. Threads. Computation Abstractions. CMSC 433, Fall Michael Hicks 1

CS61B, Spring 2003 Discussion #17 Amir Kamil UC Berkeley 5/12/03

Operating Systems. Lecture 4 - Concurrency and Synchronization. Master of Computer Science PUF - Hồ Chí Minh 2016/2017

Lecture 9: Introduction to Monitors

10/17/ Gribble, Lazowska, Levy, Zahorjan 2. 10/17/ Gribble, Lazowska, Levy, Zahorjan 4

Problems with Concurrency. February 19, 2014

Concurrency. CSCI 136: Fundamentals of Computer Science II Keith Vertanen

CSE 451: Operating Systems Winter Lecture 7 Synchronization. Steve Gribble. Synchronization. Threads cooperate in multithreaded programs

Program Graph. Lecture 25: Parallelism & Concurrency. Performance. What does it mean?

COURSE 11 PROGRAMMING III OOP. JAVA LANGUAGE

CMSC 330: Organization of Programming Languages. Threads Classic Concurrency Problems

What is a Thread? Why Multicore? What is a Thread? But a fast computer runs hot THREADS AND CONCURRENCY. Concurrency (aka Multitasking)

Threads(in Java) CSC J Paul Gibson, D311.

Concurrency in Java Prof. Stephen A. Edwards

The Dining Philosophers Problem CMSC 330: Organization of Programming Languages

Threads Questions Important Questions

CMSC 433 Programming Language Technologies and Paradigms. Spring 2013

CS 31: Introduction to Computer Systems : Threads & Synchronization April 16-18, 2019

COMP346 Winter Tutorial 4 Synchronization Semaphores

Safety SPL/2010 SPL/20 1

CS 153 Design of Operating Systems Winter 2016

Multi-threaded programming in Java

CMSC 330: Organization of Programming Languages. The Dining Philosophers Problem

Part IV Other Systems: I Java Threads

G Programming Languages Spring 2010 Lecture 13. Robert Grimm, New York University

Parallel Programming Languages COMP360

CS 162 Operating Systems and Systems Programming Professor: Anthony D. Joseph Spring 2004

Introduction to OS Synchronization MOS 2.3

ECE 587 Hardware/Software Co-Design Lecture 07 Concurrency in Practice Shared Memory I

CMSC 330: Organization of Programming Languages

Synchronization

Synchronization. Announcements. Concurrent Programs. Race Conditions. Race Conditions 11/9/17. Purpose of this lecture. A8 released today, Due: 11/21

Reading from URL. Intent - open URL get an input stream on the connection, and read from the input stream.

5. Liveness and Guarded Methods

Transcription:

Threads and Concurrency in Java 1

Concurrency! What every computer engineer needs to know about concurrency: Concurrency is to untrained programmers as matches are to small children. It is all too easy to get burned. 2003--09 T. S. Norvell Memorial University Threads. Slide 2

Concurrency: What! Concurrency means that there are multiple agents running at the same time and interacting. 2003--09 T. S. Norvell Memorial University Threads. Slide 3

Concurrency: Where! Sources of concurrency: " We have concurrency when we have interacting processes running on different computers (e.g. Apache a web server on mona.engr.mun.ca and Firefox a web browser on paradox.engr.mun.ca ) 2003--09 T. S. Norvell Memorial University Threads. Slide 4

Concurrency : Where " We also have concurrency when we have interacting processes running on the same computer. E.g. Firefox and Windows Explorer.! Every interactive program is part of a concurrent system: the user is a concurrent agent. " Furthermore we can have multiple threads of control within one OS process.! A.K.A. multithreading! Concurrency can be intermachine, interprocess, or multithreading. 2003--09 T. S. Norvell Memorial University Threads. Slide 5

Concurrency : Where! These slides concentrate on intraprocess concurrency in Java. 2003--09 T. S. Norvell Memorial University Threads. Slide 6

Concurrency: Why! Reasons for using concurrency " Speed. Multiple threads can be run on multiple processors (or multiple cores). This may give a speed advantage. " Distribution. We may wish different parts of a system to be located on different machines for reasons of convenience, security, reliability,. 2003--09 T. S. Norvell Memorial University Threads. Slide 7

Concurrency: Why! Reasons for using concurrency " Asynchrony. It is easiest to deal with multiple sources of events by having one thread dedicated to each stream of incoming or outgoing events.! For example, a web browser may use one thread to deal with input from the user and one thread for each server it is currently interacting with.! Likewise a web server will typically dedicate at least one thread to each current session. 2003--09 T. S. Norvell Memorial University Threads. Slide 8

Threads! Each thread has its own " program counter " registers " local variables and stack! All threads share the same heap (objects) 2003--09 T. S. Norvell Memorial University Threads. Slide 9

Concurrency: How Multiple processors! Multiprocessor (and mulitcore) 2 threads 2 processors time CPU CPU L1 Cache L1 Cache L2 Cache Central Memory 2003--09 T. S. Norvell Memorial University Threads. Slide 10

Concurrency: How Time slicing implementation 2 threads 1 processor! Single processor " The CPU is switched between threads at unpredictable times time! Multiple processor " Thread may occasionally migrate 3 threads 2 processors time 2003--09 T. S. Norvell Memorial University Threads. Slide 11

Context switch Memory Previously The This Pipeline PC Initially and green is a registers the conceptual saved PC drains thread red thread now are view and saved. executes register values are is of executing the process. fetched. Implementation details will vary. Copy of PC Copy of registers PC Registers Copy of PC Copy of registers Stack IF DEC EX WB Stack CPU Instructions Heap 2003--09 T. S. Norvell Memorial University Threads. Slide 12

Multithreading CPU Memory CPU 20 1 PC In multithreading CPUs, two or more register sets share the same execution units. Stack Registers Execution units Stack Multithreading CPUs can be superscalar. When instructions from 2 or more threads can start in the same cycle, it is called simultaneous multithreading (SMT). 01 2 Instructions Registers 31 02 PC Heap 2003--09 T. S. Norvell Memorial University Threads. Slide 13

Speed: A cautionary tail! I thought I d demonstrate speed-up with multiple threads.! I tried sorting 10,000,000 numbers using a concurrent quicksort. " On my single processor laptop,! 1 thread took about 14 seconds,! 2 threads about 15 seconds. " No surprise there. 2003--09 T. S. Norvell Memorial University Threads. Slide 14

Speed: A cautionary tail " On my partner s shiny new dual-core laptop! 1 thread took about 11 seconds,! 2 threads took about 20 seconds! " Why?! The threads communicated a lot.! When all communication was between threads on the same core, this was efficient.! When communication was between threads on different cores, it took more time. " Data had to be copied from one processor s cache to the other s, and back, over and over. " After tuning the threads to use less communication, the algorithm did indeed run almost twice as fast with 2 threads on the dual-core. 2003--09 T. S. Norvell Memorial University Threads. Slide 15

Thread Objects in Java! In Java, threads are represented by objects of class java.lang.thread.! Hook method run contains code for the thread to execute. (Template Method Pattern.) public class ThreadExampleextends Thread { private String message ; ThreadExample( String message ) { this.message = getname() + ": " + message; } } @Override public void run() { for( int i=0 ; i<1000 ; ++i ) { System.out.println( message ); } } 2003--09 T. S. Norvell Memorial University Threads. Slide 16

Starting a new thread! Calling t.start() starts a new thread " which executes the t.run() public static void main(string[] args) { ThreadExample thread0 = new ThreadExample ( "Hi" ) ; ThreadExample thread1 = new ThreadExample ( "Ho" ) ; } thread0.start(); thread1.start(); System.out.println( Thread.currentThread().getName() + ": Main is done") ; 2003--09 T. S. Norvell Memorial University Threads. Slide 17

Output for example! Possible output for example: Thread-1: Ho Thread-1: Ho Thread-0: Hi main: Main is done Thread-1: Ho Thread-0: Hi (and so on for another 1995 lines) " When t.run() completes the thread stops. " When all threads have stopped the program exits 2003--09 T. S. Norvell Memorial University Threads. Slide 18

Race Conditions! A system has a race condition when its correctness depends the order of certain events, but the order of those events is not sufficiently controlled by the design of the system. 2003--09 T. S. Norvell Memorial University Threads. Slide 19

Race Conditions! Often race conditions occur because 2 agents have uncontrolled access to a shared resource! Consider two train routes that share the same bridge! Unless access to the shared resource is controlled, disaster may ensue. 2003--09 T. S. Norvell Memorial University Threads. Slide 20

Race Conditions! A solution: " Before crossing the bridge, trains acquire a token " After crossing the bridge, trains relinquish the token Acquire the token Relinquish the token Acquire the token Relinquish the token Only Both As Initially the soon one trains other as can try train token the succeed. token can acquire is free acquire is free at the the again same token time 2003--09 T. S. Norvell Memorial University Threads. Slide 21

Race Conditions in Software! Remember: objects are shared by threads! In Java, access to an object s methods is uncontrolled, by default!!!!! Suppose we have public class Counter { private int count = 0 ; public void increment() { ++count ; } } public int getcount() { return count ; } 2003--09 T. S. Norvell Memorial University Threads. Slide 22

Race Conditions in Software! Two threads share a Counter Counter c = new Counter() ; Thread p = new CountingThread( c ) ; Thread q = new CountingThread( c ) ; p.start() ; q.start() ; 2003--09 T. S. Norvell Memorial University Threads. Slide 23

Race Conditions in Software! Two threads invoke increment at about the same time " (Recall: Registers are local to the thread.)! A race condition results. p q count r0 (in p) r0 (in q) load count to r0 load count to r0 r0 # r0 + 1 41 41 41 42 r0 # r0 + 1 store r0 to count store r0 to count 42 42 42 41+1+1 = 42? Of the two increments, one was lost. 2003--09 T. S. Norvell Memorial University Threads. Slide 24

Race Conditions: Another Example! Consider transfers on an account class AccountManager { private Account savings ; private Account chequing; public void transfertosavings( int amount ) { int s = savings.getbalance() ; int c = checking.getbalance() ; savings.setbal( s+amount ) ; chequing.setbal( c-amount ) ; } }! Two threads execute transfers. 2003--09 T. S. Norvell Memorial University Threads. Slide 25

Race Conditions : Another Example One Thread (amount = 500) s = savings.getbalance() c = chequing.getbalance() 3500 savings.setbal(s+500) 1500 chequing.setbal(c-500) Another Thread (amount = 1000) s = savings.getbalance() c = chequing.getbalance() 4000 savings.setbal(s+1000) 2000 chequing.setbal(c-1000) sav chq 3000 3000 2000 I started with $6000 and ended with $5000. This is not good. 2003--09 T. S. Norvell Memorial University Threads. Slide 26

synchronized to the rescue! Methods may be declared synchronized class Counter { private int count = 0 ; synchronized void increment() { ++count ; } } synchronized int getcount() { return count ; } 2003--09 T. S. Norvell Memorial University Threads. Slide 27

synchronized to the rescue! Each object has an associated token called its lock.! At each point in time, each lock either is owned by no thread or is owned by one thread.! A thread that attempts to acquire a lock must wait until no thread owns the lock.! After acquiring a lock, a thread owns it until it relinquishes it. 2003--09 T. S. Norvell Memorial University Threads. Slide 28

synchronized to the rescue! When a thread invokes a synchronized method x.m(): " If it does not already own the recipient s (x s) lock,! It waits until it can acquires the lock " Once the lock has been acquired the thread begins to execute the method! When a thread leaves an invocation of a synchronized method: " If it is the leaving the last synchonronzed invocation for that object! It relinquishes the lock as it leaves 2003--09 T. S. Norvell Memorial University Threads. Slide 29

synchronized to the rescue! Hence, for any object x, at most one thread may be executing any of x s synchronized methods. 2003--09 T. S. Norvell Memorial University Threads. Slide 30

synchronized to the rescue Example: Two threads invoke o.increment() at about the same time. 2003--09 T. S. Norvell Memorial University Threads. Slide 31

synchronized to the rescue Thread p request lock on object o acquire lock on object o load count to r0 r0 # r0 + 1 store r0 to count relinquish lock on object o Thread q request lock on object o waits waits waits waits acquire lock on object o load count to r0 r0 # r0 + 1 store r0 to count relinquish lock on object o 2003--09 T. S. Norvell Memorial University Threads. Slide 32

T2 T1 The Room metaphor When a thread Each has left all object is synchronized a room methods of the object, it leaves At the all room times, at most one allowing thread is other allowed another thread to to be enter. in the room. The antechamber The room When a thread not in the room calls a synchronized method, it enters an antechamber. There it waits until the room is empty. When the room is empty, at most one thread is allowed to enter the room 2003--09 T. S. Norvell Memorial University Threads. Slide 33

Design rule: Shared Objects! For any object that might be used by more than one thread at the same time " Declare all methods that access or mutate the data synchronized! (Note: private methods are exempted from this rule, as they can only be called once a nonprivate method has been called.) Constructors need not (and can not) be synchronized 2003--09 T. S. Norvell Memorial University Threads. Slide 34

Accounts! In AccountManager add synchronized to all methods class AccountManager { private Account savings ; private Account chequing; public synchronized void transfertosavings( int amount ) { int s = savings.getbalance() ; int c = checking.getbalance() ; savings.setbal( s+amount ) ; chequing.setbal( c-amount ) ; } } 2003--09 T. S. Norvell Memorial University Threads. Slide 35

Waiting! Synchronized methods introduce one kind of coordination between threads.! Sometimes we need a thread to wait until a specific condition has arisen. 2003--09 T. S. Norvell Memorial University Threads. Slide 36

Waiting by Polling! For example in a Counter class we might want to wait until the count is 0 or less.! We could do this class Counter { private int count ; Note that waitforzeroorless is not synchronized public Counter( int count ) { this.count = count ; } synchronized void decrement() { count -= 1; } synchronized int getcount() { return count ; } // post: getcount() <= 0 void waitforzeroorless() { // Polling loop while( getcount() > 0 ) /*do nothing*/; } } 2003--09 T. S. Norvell Memorial University Threads. Slide 37

Waiting by Polling! Slightly improving this we can write // post: getcount() <= 0 void waitforzeroorless() { // Polling loop while( getcount() > 0 ) Thread.yield () ; } which keeps the thread from hogging the (a) CPU while polling. 2003--09 T. S. Norvell Memorial University Threads. Slide 38

Waiting by wait and notifyall! Better, we can have a thread wait until it is notified that the condition has (or may have) come about.! While waiting, the thread relinquishes ownership and waits until some later time.! To wait, a thread sends the object a wait message.! To allow other threads to stop waiting, threads sends a notifyall message to the object. 2003--09 T. S. Norvell Memorial University Threads. Slide 39

The Room metaphor When a thread in the room sends a wait message, it leaves the room and enters the waiting room. Later another thread enters. Add a waiting room Waiting room The antechamber The T1 room 2003--09 T. S. Norvell Memorial University Threads. Slide 40 T2 It sends a notifyall message. All threads in the waiting room move to the antechamber. And so they can reenter when the room is empty.

wait and notifyall example. class Counter { private int count ; Note that waitforzeroorless is synchronized public Counter( int count ) { this.count = count ; } synchronized void decrement() { count -= 1 ; if( count <= 0 ) notifyall() ; } // post: getcount() <= 0 synchronized void waitforzero() { while( count > 0 ) { try { wait() ; } catch( InterruptedException e ) {} } } } 2003--09 T. S. Norvell Memorial University Threads. Slide 41

A possible sequence! One thread " Calls waitforzero enters the room " Sees count is 1. " calls wait, enters the waiting room " waits in waiting room " " " " " waits in antechamber " " " reenters the room " returns from wait " sees count is 0 and returns! Another thread Calls decrement enters the room. " count-- " call notifyal,l moving other thread to wait queue for the lock " returns leaving the room 2003--09 T. S. Norvell Memorial University Threads. Slide 42

Passing messages! We want to pass messages any number of producers and consumers executing on any number of threads. producer producer producer consumer consumer send(0) receive() :Mailbox {} 0 2003--09 T. S. Norvell Memorial University Threads. Slide 43

Passing messages! We want to pass messages between threads so that " Each message is received no more than once " No message is overwritten before it is received. " A receiver may have to wait until a new message is sent " A sender may have to wait until there is room in the queue " Up to 100 messages can be sent but not yet received. 2003--09 T. S. Norvell Memorial University Threads. Slide 44

Passing messages! Receivers may need to wait. " Suppose the mailbox initially has no messages producer producer producer consumer consumer send(1) receive() :Mailbox 1 {} 2003--09 T. S. Norvell Memorial University Threads. Slide 45

Passing messages! Producers may need to wait. " Suppose the capacity is 5 and the mailbox is full producer producer producer consumer consumer send(6) receive() :Mailbox 1 {} 2 3 4 5 6 2003--09 T. S. Norvell Memorial University Threads. Slide 46

Passing messages incomplete class Mailbox<MessageType> { private static final int CAP = 100 ; private Queue<MessageType> q = new Queue<MessageType>() ; // invariant: q.size() <= CAP public synchronized void send(messagetype mess) { // wait until q.size()< CAP q.put( mess ) ; } To do public synchronized MessageType receive() { // wait until q.size() > 0 return q.take() ; } To do 2003--09 T. S. Norvell Memorial University Threads. Slide 47

Passing messages add waits class Mailbox<MessageType> { private static final int CAP = 100 ; private Queue<MessageType> q = new Queue<MessageType>() ; // invariant: q.size() <= CAP public synchronized void send(messagetype mess) { // wait until q.size()< CAP while( q.put( mess q.size()==cap ) ; } ) { try { wait() ; } catch( InterruptedException e ) {} } To do public synchronized MessageType receive() { // wait until q.size() > 0 while( return q.size()==0 q.take() ; }) { try { wait() ; } catch( InterruptedException e ) {} } To do 2003--09 T. S. Norvell Memorial University Threads. Slide 48

Passing messages add notifications class Mailbox<MessageType> { private static final int CAP = 100 ; private Queue<MessageType> q = new Queue<MessageType>() ; // invariant: q.size() <= CAP public synchronized void send(messagetype mess) { // wait until q.size()< CAP while( q.size()==cap ) { try { wait() ; } catch( InterruptedException e ) {} } q.put( mess ) ; notifyall() } ; public synchronized MessageType receive() { // wait until q.size() > 0 while( q.size()==0 ) { try { wait() ; } catch( InterruptedException e ) {} } return notifyall() q.take() ; ; } Done 2003--09 T. S. Norvell Memorial University Threads. Slide 49

Even better than wait and notifyall! As software gets more complex, using wait and notifyall can be a bit awkward and is easy to mess up.! An improvement is to use my monitor package.! See http://www.engr.mun.ca/~theo/misc/monitors/ monitors.html 2003--09 T. S. Norvell Memorial University Threads. Slide 50

Deadlock! While waiting can solve safety issues " (e.g. ensuring noncorruption of data, nonduplication of messages, nonloss of messages),! it can cause liveness problems.! In particular " if one thread is waiting for another to do something, and " the other thread is waiting for the first to do something, " then we have deadlock 2003--09 T. S. Norvell Memorial University Threads. Slide 51

Deadlock Example! Suppose we have a bank account class class Account { private int balance = 0.0 ; public synchronized void addfunds( int amount ) { balance += amount ; } } public void transfer ( int amount, Account toaccount ) { if( balance >= amount ) { toaccount.addfunds( amount ) ; addfunds( - amount ) ; } else { } } 2003--09 T. S. Norvell Memorial University Threads. Slide 52

Deadlock Example! There is a subtle problem here.! The intent is that one should not be able to transfer out of an account more money than it has. (A safety problem.)! But, if two threads attempt to transfer from the same account at about the same time, then they might both succeed, even though the final balance will be negative.! To fix this, we make transfer synchronized. 2003--09 T. S. Norvell Memorial University Threads. Slide 53

Deadlock Example class Account { private int balance = 0 ; public synchronized void addfunds( int amount ) { balance += amount ; } } public synchronized void transfer (int amount, Account toaccount){ if( balance >= amount ) { toaccount.addfunds( amount ) ; balance -= amount ; } else { } } 2003--09 T. S. Norvell Memorial University Threads. Slide 54

Deadlock Example! But now deadlock is possible.! Suppose thread 0 tries to transfer from account x to account y.! At roughly the same time thread 1 attempts to transfer from account y to account x 2003--09 T. S. Norvell Memorial University Threads. Slide 55

A possible sequence! Thread 0 " calls x.transfer(100, y) " obtains a lock on x " calls y.addfunds() " waits for lock on y " waits for lock on y " waits for lock on y " waits for lock on y " ad infinitum! Thread 1 " calls y.transfer( 50, x ) " obtains a lock on y " calls x.addfunds() " waits for lock on x " waits for lock on x " waits for lock on x " waits for lock on x " ad infinitum The Threads are now deadlocked! 2003--09 T. S. Norvell Memorial University Threads. Slide 56

A solution to deadlock! One solution is to always lock objects in a particular order.! E.g. give each lockable object a globally unique # public void transfer ( int amount, Account toaccount ) { boolean choice = this.serialnum() <= toaccount. serialnum() ; synchronized( choice? this : toaccount ) { synchronized( choice? toaccount : this ) { if( balance >= amount ) { toaccount.addfunds( amount ) ; balance -= amount ; } else { } } } } } 2003--09 T. S. Norvell Memorial University Threads. Slide 57

Testing Concurrent Programs! You can not effectively test concurrent programs to show that they are error free! Because of race conditions, a test may pass millions of times by chance.! Tests that fail are useful. They tell us we have a bug.! Tests that pass only tell us that it is possible for the code to compute the correct result. 2003--09 T. S. Norvell Memorial University Threads. Slide 58

Testing: A True Story! I wanted to illustrate how race conditions can cause data corruption.! So I wrote a program with two threads sharing an int variable x. " Initially x was set to 0 " One thread incremented x a thousand times " The other thread decremented x a thousand times. 2003--09 T. S. Norvell Memorial University Threads. Slide 59

Testing: A True Story class Incrementor extends Thread { public void run() { for(int i=0 ; i < 1000; ++i) ++x ; } } class Decrementor extends Thread { public void run() { for(int i=0 ; i < 1000; ++i) --x ; } } 2003--09 T. S. Norvell Memorial University Threads. Slide 60

Testing: A True Story! I ran the two threads concurrently System.out.println( "The initial value of x is: " + x ) ; Thread p = new Incrementer() ; Thread q = new Decrementer() ; p.start() ; q.start(); p.join() ; q.join(); System.out.println( "After "+1000+" increments and "+1000+" decrements" ) ; System.out.println( "the final value of x is: " + x ) ;! What do you think happened? 2003--09 T. S. Norvell Memorial University Threads. Slide 61

Testing: A True Story! Here s the output: The initial value of x is: 0 After 1000 increments and 1000 decrements the final value of x is: 0! Even though I deliberately wrote a faulty program and gave it 1 thousand chances to fail the test, it passed anyway.. " I tried 10,000. Then 100,000. Then 1,000,000 " Same result 2003--09 T. S. Norvell Memorial University Threads. Slide 62

Testing: A True Story! And why did it pass? " The JVM happened to give each thread time slices so long that the incrementing thread completed its 1,000,000 increments before the main thread had a chance to even start the decrementing thread.! Changing to 10,000,000 increments and decrements revealed the bug.! So did running the program on a multicore machine. 2003--09 T. S. Norvell Memorial University Threads. Slide 63

Testing: A True Story! I had fallen victim to optimism.! I had optimistically assumed that such an obvious bug would cause a thorough test to fail.! If tests designed to reveal blatant bugs, which we know are in the program, fail to reveal them, should we expect testing to reliably reveal subtle bugs we do not know about? 2003--09 T. S. Norvell Memorial University Threads. Slide 64

If you can t test, then what?! The good news is that " although testing is insufficient to reveal bugs, " there are design and analysis techniques that allow you to prove your programs correct. 2003--09 T. S. Norvell Memorial University Threads. Slide 65

Concurrency! What every computer engineer needs to know about concurrency: Concurrency is to untrained programmers as matches are to small children. It is all too easy to get burned. " Race conditions " Deadlock " Insufficiency of testing 2003--09 T. S. Norvell Memorial University Threads. Slide 66

Summary of terminology! concurrency: multiple agents running at the same time, interacting! thread: an independent path of control! Thread: a Java class representing threads! race condition: a hazard caused by the unpredictability of execution timing! synchronized access: locking of objects to obtain exclusive access! wait and notifyall: threads may wait until notified! deadlock: a cycle of threads mutually waiting for each other! safety property: a property that says something (bad) will never happen! liveness property: a property that says something (good) will eventually happen 2003--09 T. S. Norvell Memorial University Threads. Slide 67