Principles of Software Construction: Objects, Design and Concurrency. The Perils of Concurrency, Part 2 (Can't live with it, can't live without it.

Similar documents
Principles of Software Construction: Objects, Design and Concurrency. The Perils of Concurrency, Part 2 Can't live with it. Cant live without it.

Principles of Software Construction: Objects, Design, and Concurrency. The Perils of Concurrency Can't live with it. Cant live without it.

Principles of Software Construction: Objects, Design, and Concurrency. The Perils of Concurrency, Part 3 Can't live with it. Can't live without it.

Principles of Software Construction: Objects, Design, and Concurrency. The Perils of Concurrency Can't live with it. Can't live without it.

Principles of Software Construction: Objects, Design and Concurrency. The Perils of Concurrency, Part 3 Can't live with it. Cant live without it.

Principles of Software Construction: Objects, Design and Concurrency. The Perils of Concurrency, part 4 Can't live with it. Can't live without it.

Jonathan Aldrich Charlie Garrod

Threads and Java Memory Model

SSC - Concurrency and Multi-threading Java multithreading programming - Synchronisation (II)

Threads Questions Important Questions

Concurrent Programming using Threads

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

Charlie Garrod Bogdan Vasilescu

Principles of Software Construction: Objects, Design, and Concurrency

Basics of. Multithreading in Java

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

Principles of Software Construction: Objects, Design and Concurrency. The Perils of Concurrency, Part 4 (Can't live with it, can't live without it.

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

Threads and Locks, Part 2. CSCI 5828: Foundations of Software Engineering Lecture 08 09/18/2014

Chapter 32 Multithreading and Parallel Programming

Producing Production Quality Software. Lecture 12: Concurrent and Distributed Programming Prof. Arthur P. Goldberg Fall, 2004

The New Java Technology Memory Model

Java Threads Vs Processes. CS Concurrent Programming. Java Threads. What can a thread do? Java Concurrency

Models of concurrency & synchronization algorithms

F. Tip and M. Weintraub CONCURRENCY

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

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

+ Today. Lecture 26: Concurrency 3/31/14. n Reading. n Objectives. n Announcements. n P&C Section 7. n Race conditions.

Principles of Software Construction: Concurrency, Part 2

Java Threads. Introduction to Java Threads

Introduction to Java Threads

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

Synchronization Lecture 23 Fall 2017

What is a thread anyway?

Faculty of Computers & Information Computer Science Department

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

Josh Bloch Charlie Garrod Darya Melicher

Principles of Software Construction: Objects, Design, and Concurrency. Distributed System Design, Part 2. Charlie Garrod Jonathan Aldrich.

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

SFDV3006 Concurrent Programming

Synchronization in Java

Dr.-Ing. Michael Eichberg

An Introduction to Programming with Java Threads Andrew Whitaker University of Washington 9/13/2006. Thread Creation

Race Conditions & Synchronization

Daemon thread, 7 Deadlock, 27

Object Oriented Programming and Design in Java. Session 18 Instructor: Bert Huang

Synchronization II: EventBarrier, Monitor, and a Semaphore. COMPSCI210 Recitation 4th Mar 2013 Vamsi Thummala

Synchronized Methods of Old Versions of Java

More thread safety and Concurrent collections. Nasser Giacaman CompSci 230: Software Design and Construction

Principles of Software Construction: Objects, Design and Concurrency. Exceptions, scope, static data and methods, and Generics.

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

Only one thread can own a specific monitor

Synchronization in Concurrent Programming. Amit Gupta

CS 159: Parallel Processing

Charlie Garrod Michael Hilton

CS 153 Design of Operating Systems Winter 2016

COMP31212: Concurrency A Review of Java Concurrency. Giles Reger

COMP 322: Fundamentals of Parallel Programming

EDA095 Processes and Threads

Learning from Bad Examples. CSCI 5828: Foundations of Software Engineering Lecture 25 11/18/2014

CMSC 433 Spring 2013 Exam 1

Programmazione Avanzata e Paradigmi Ingegneria e Scienze Informatiche - UNIBO a.a 2013/2014 Lecturer: Alessandro Ricci

Multi-threading in Java. Jeff HUANG

Mutual Exclusion: Classical Algorithms for Locks

Monitors; Software Transactional Memory

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

Results of prelim 2 on Piazza

EDAF65 Processes and Threads

Threads Synchronization

CS11 Java. Fall Lecture 7

Charlie Garrod Bogdan Vasilescu

Race Conditions & Synchronization

Synchronization Lecture 24 Fall 2018

CSE 332: Locks and Deadlocks. Richard Anderson, Steve Seitz Winter 2014

CS 351 Design of Large Programs Threads and Concurrency

EMBEDDED SYSTEMS PROGRAMMING More About Languages

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

The Dining Philosophers Problem CMSC 330: Organization of Programming Languages

A Sophomoric Introduction to Shared-Memory Parallelism and Concurrency Lecture 5 Programming with Locks and Critical Sections

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

CISC 4700 L01 Network & Client-Server Programming Spring Cowell Chapter 15: Writing Threaded Applications

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

Multithreaded Programming

Thread-unsafe code. Synchronized blocks

CONCURRENT API AND PARALLEL PROGRAMMING

Multi-threaded programming in Java

CSE 451: Operating Systems Winter Lecture 7 Synchronization. Hank Levy 412 Sieg Hall

CMSC 433 Programming Language Technologies and Paradigms. Composing Objects

Computation Abstractions. CMSC 330: Organization of Programming Languages. So, What Is a Thread? Processes vs. Threads. A computer.

Concurrency & Synchronization. COMPSCI210 Recitation 25th Feb 2013 Vamsi Thummala Slides adapted from Landon Cox

Principles of Software Construction: Objects, Design and Concurrency. Mutability and Java Potpourri. toad Fall 2013

CS153: Deadlock. Chengyu Song. Slides modified from Harsha Madhyvasta, Nael Abu-Ghazaleh, and Zhiyun Qian

CMSC 330: Organization of Programming Languages

Dr.-Ing. Michael Eichberg

Atomicity CS 2110 Fall 2017

Chapter 19 Multithreading

Java Platform Concurrency Gotchas

What is the Race Condition? And what is its solution? What is a critical section? And what is the critical section problem?

Problems with Concurrency. February 19, 2014

Transcription:

Principles of Software Construction: Objects, Design and Concurrency 15-214 toad The Perils of Concurrency, Part 2 (Can't live with it, can't live without it.) Spring 2013 Christian Kästner Charlie Garrod School of Computer Science 2012-13 C Garrod, C Kästner, J Aldrich, and W Scherlis

Administrivia Homework 5, The Framework Strikes Back Must select partner(s) by tonight 5a due in recitation next Wednesday (03 April) toad 2

Key topics from Tuesday toad 3

Last time: Concurrency, part 1 The concurrency backstory Motivation, goals, problems, toad 4

Last time: Concurrency, part 1 The concurrency backstory Motivation, goals, problems, http://www.genome.gov/sequencingcosts/ toad 5

Today: Concurrency, part 2 Primitive concurrency in Java Explicit synchronization with threads and shared memory More concurrency problems Higher-level abstractions for concurrency (still mostly not today) Data structures Higher-level languages and frameworks Hybrid approaches toad 6

Basic concurrency in Java The java.lang.runnable interface void run();! The java.lang.thread class Thread(Runnable r);! void start();! static void sleep(long millis);! void join();! boolean isalive();! static Thread currentthread(); See IncrementTest.java toad 7

Atomicity An action is atomic if it is indivisible Effectively, it happens all at once No effects of the action are visible until it is complete No other actions have an effect during the action In Java, integer increment is not atomic i++;! is actually 1. Load data from variable i! 2. Increment data by 1! 3. Store data to variable i! toad 8

One concurrency problem: race conditions A race condition is when multiple threads access shared data and unexpected results occur depending on the order of their actions E.g., from IncrementTest.java: Suppose classdata starts with the value 41: Thread A: classdata++;! Thread B: classdata++;! One possible interleaving of actions: 1A. Load data(41) from classdata! 1B. Load data(41) from classdata! 2A. Increment data(41) by 1 -> 42 2B. Increment data(41) by 1 -> 42! 3A. Store data(42) to classdata! 3B. Store data(42) to classdata! toad 9

Race conditions in real life E.g., check-then-act on the highway R C L toad 10

Race conditions in real life E.g., check-then-act at the bank The "debit-credit problem" Alice, Bob, Bill, and the Bank A. Alice to pay Bob $30 Bank actions 1. Does Alice have $30? 2. Give $30 to Bob 3. Take $30 from Alice B. Alice to pay Bill $30 Bank actions 1. Does Alice have $30? 2. Give $30 to Bill 3. Take $30 from Alice If Alice starts with $40, can Bob and Bill both get $30? toad 11

Race conditions in real life E.g., check-then-act at the bank The "debit-credit problem" Alice, Bob, Bill, and the Bank A. Alice to pay Bob $30 Bank actions 1. Does Alice have $30? 2. Give $30 to Bob 3. Take $30 from Alice B. Alice to pay Bill $30 Bank actions 1. Does Alice have $30? 2. Give $30 to Bill 3. Take $30 from Alice A.1 A.2 B.1 B.2 A.3 B.3! If Alice starts with $40, can Bob and Bill both get $30? toad 12

Race conditions in your life E.g., check-then-act in simple code public class StringConverter {! private Object o;! public void set(object o) {! this.o = o;! }! public String get() {! if (o == null) return "null";! return o.tostring();! }! }! See StringConverter.java, Getter.java, Setter.java toad 13

Some actions are atomic Precondition: int i = 7;! Thread A: i = 42;! Thread B: ans = i;! What are the possible values for ans? toad 14

Some actions are atomic Precondition: int i = 7;! Thread A: i = 42;! Thread B: ans = i;! What are the possible values for ans? i:! 00000 00000111 i:! 00000 00101010 toad 15

Some actions are atomic Precondition: int i = 7;! Thread A: i = 42;! Thread B: ans = i;! What are the possible values for ans? i:! 00000 00000111 i:! 00000 00101010 In Java: Reading an int variable is atomic Writing an int variable is atomic Thankfully, ans:!00000 00101111 is not possible toad 16

Bad news: some simple actions are not atomic Consider a single 64-bit long value high bits low bits Concurrently: Thread A writing high bits and low bits Thread B reading high bits and low bits Precondition: long i = 10000000000;! Thread A: i = 42;! Thread B: ans = i;! ans:!01001 00000000 ans:!00000 00101010 ans:!01001 00101010 (10000000000) (42) (10000000042 or ) toad 17

Primitive concurrency control in Java Each Java object has an associated intrinsic lock All locks are initially unowned Each lock is exclusive: it can be owned by at most one thread at a time The synchronized keyword forces the current thread to obtain an object's intrinsic lock E.g., synchronized void foo() { } // locks "this"!!! synchronized(fromacct) {!!! if (fromacct.getbalance() >= 30) {! toacct.deposit(30);! fromacct.withdrawal(30);! }! } See SynchronizedIncrementTest.java toad 18

Primitive concurrency control in Java java.lang.object allows some coordination via the intrinsic lock: void wait();! void wait(long timeout);! void wait(long timeout, int nanos);! void notify();! void notifyall();! See Blocker.java, Notifier.java, NotifyExample.java toad 19

Primitive concurrency control in Java Each lock can be owned by only one thread at a time Locks are re-entrant: If a thread owns a lock, it can lock the lock multiple times A thread can own multiple locks synchronized(lock1) {! // do stuff that requires lock1!! synchronized(lock2) {! // do stuff that requires both locks! }!! //! } toad 20

Another concurrency problem: deadlock E.g., Alice and Bob, unaware of each other, both need file A and network connection B Alice gets lock for file A Bob gets lock for network connection B Alice tries to get lock for network connection B, and waits Bob tries to get lock for file A, and waits See Counter.java and DeadlockExample.java toad 21

Dealing with deadlock (abstractly, not with Java) Detect deadlock Statically? Dynamically at run time? Avoid deadlock Alternative approaches Automatic restarts Optimistic concurrency control toad 22

Detecting deadlock with the waits-for graph The waits-for graph represents dependencies between threads Each node in the graph represents a thread A directed edge T1->T2 represents that thread T1 is waiting for a lock that T2 owns Deadlock has occurred iff the waits-for graph contains a cycle b a d e c f g Got a problem with this? h i toad 23

Deadlock avoidance algorithms Prevent deadlock instead of detecting it E.g., impose total order on all locks, require locks acquisition to satisfy that order Thread: acquire(lock1) acquire(lock2) acquire(lock9) acquire(lock42) // now can't acquire lock30, etc Got a problem with this? toad 24

Avoiding deadlock with restarts One option: If thread needs a lock out of order, restart the thread Get the new lock in order this time Another option: Arbitrarily kill and restart longrunning threads toad 25

Avoiding deadlock with restarts One option: If thread needs a lock out of order, restart the thread Get the new lock in order this time Another option: Arbitrarily kill and restart longrunning threads Optimistic concurrency control e.g., with a copy-on-write system Don't lock, just detect conflicts later Restart a thread if a conflict occurs toad 26

Another concurrency problem: livelock toad 27

Another concurrency problem: livelock In systems involving restarts, livelock can occur Lack of progress due to repeated restarts Starvation: when some task(s) is(are) repeatedly restarted because of other tasks toad 28

Concurrency control in Java Using primitive synchronization, you are responsible for correctness: Avoiding race conditions Progress (avoiding deadlock) Java provides tools to help: volatile fields java.util.concurrent.atomic! java.util.concurrent! toad 29

The Java happens-before relation Java guarantees a transitive, consistent order for some memory accesses Within a thread, one action happens-before another action based on the usual program execution order Release of a lock happens-before acquisition of the same lock Object.notify happens-before Object.wait returns Thread.start happens-before any action of the started thread Write to a volatile field happens-before any subsequent read of the same field Assures ordering of reads and writes A race condition can occur when reads and writes are not ordered by the happens-before relation toad 30

The java.util.concurrent.atomic package Concrete classes supporting atomic operations AtomicInteger!!int get();!!void set(int newvalue);!!int getandset(int newvalue);!!int getandadd(int delta);!!! AtomicIntegerArray! AtomicBoolean! AtomicLong!! toad 31

The java.util.concurrent package Interfaces and concrete thread-safe data structure implementations ConcurrentHashMap! BlockingQueue! ArrayBlockingQueue! SynchronousQueue! CopyOnWriteArrayList! Other tools for high-performance multi-threading ThreadPools and Executor services! Locks and Latches toad 32

java.util.concurrent.concurrenthashmap! Implements java.util.map<k,v>! High concurrency lock striping Internally uses multiple locks, each dedicated to a region of the hash table Locks just the part of the table you actually use You use the ConcurrentHashMap like any other map Locks Hashtable toad 33

Next week: More concurrency toad 34