OOP e uge kursusgang: Samtidighed (II) Safety = sikkerhed. Safety

Relaterede dokumenter
et enkelt kontrol flow sætningerne i programmet afvikles en ad gangen flowet følger dels den tekstlige rækkefølge

Real-time programming safety in Java and Ada

Dag 10 Flertrådet programmering

Hvordan organiseres et programs grafik-elementer? OOP e uge kursusgang. Advarsel! Component-objekter

Parallelle algoritmer

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Dag 10 Flertrådet programmering

Stakke, køer og lidt om hægtede lister - kapitel 16 og 17

Koordinering. dopsys

Software Construction 1 semester (SWC) Spørgsmål 1

Objektorienterede metoder

Singleton pattern i Java

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Vejledende løsninger

Løsning af møntproblemet

Stakke, køer og lidt om hægtede lister

Videregående programmering i Java

Planen for idag. Synkroniseringsmekanismer. Krav til løsning. Kritiske regioner. Bagerens algoritme. Kritisk region via delt lager.

Parallelle algoritmer

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Modern Concurrency Abstractions for C#

Introduktion til datastrukturer

Introduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer

Mandatory Assignment 1

Introduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer

Introduktion til datastrukturer. Philip Bille

Principper for Samtidighed og Styresystemer

Forelæsning Uge 4 Torsdag

Serialization i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Programmeringscamp. Implementer funktionerne én for én og test hele tiden.

Over Forelæsning omponenter ogrammering sigt 14, 1999 freda containere 15. oktober 1999 Eksempel: out GUI til beregning fakultet.

Forelæsning Uge 5 Mandag

Skriftlig eksamen i Datalogi

Abstrakte datatyper C#-version

3C03 Concurrency: Model-based Design

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Forelæsning Uge 4 Torsdag

Singleton pattern i C#

INGENIØRHØJSKOLEN I ÅRHUS Elektro- og IKT-afdelingen. I3PRG3 + I3DTM3 + I3ISY1-3. semester

SWC eksamens-spørgsmål. Oversigt

DM507 Algoritmer og datastrukturer

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Processer og tråde. dopsys 1

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Implementation af Koordinering. dopsys 1

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

Skriftlig eksamen i Datalogi

Forelæsning Uge 6 Mandag

Ugeseddel 4 1. marts - 8. marts

DM507 Algoritmer og datastrukturer

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

BRP Kursusintroduktion og Java-oversigt

OOP e uge kursusgang: Grafik (II) class Scribble (Tegnebrættet) Frihåndstegning: repræsentation

Processer og koordinering. dopsys 1

Common Language Runtime. Multithreading

Klasser og objekter. (Afsnit i manualen)

DM507 Algoritmer og datastrukturer

Programmeringscamp Opbygning og specialisering af klassehierarki. Simulering af en kasselinje

Videregående programmering i Java

Forelæsning Uge 2 Torsdag

Synkronisering af sekventielle processer

Kapitel 6 Events i C#

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

DM507 Algoritmer og datastrukturer

Du kan også bruge Dropbox sammen med din Iphone, Android telefon eller anden smartphone.

Hvad er Objekter - Programmering

DM507 Algoritmer og datastrukturer

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

Virkefeltsregler i Java

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

DM507 Algoritmer og datastrukturer

Objektorienteret Programmering

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Processer og koordinering

Skriftlig eksamen i Datalogi

Førsteårsprojekt F2008 Flere grafalgoritmer, og visualisering SØGES

Videregående programmering i Java

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Klasser og nedarvning

Plan. Trådbegrebet. Synkronisering. Koordinering. Eksempel: et flertrådet spil

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Tråde! Plan! Tråde! Trådbegrebet! Trådbegrebet! Synkronisering! Koordinering! Eksempel: et flertrådet spil!

Vejledning til at tjekke om du har sat manuel IP på din computer.

Forelæsning Uge 3 Mandag

Eksempel på en database: studenter, kurser, eksamener

Forelæsning Uge 3 Mandag

QUICK START Updated:

SigmaT.

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

Videregående programmering i Java

Forelæsning Uge 4 Torsdag

Programmering. Udvidet Programmering. Kurserne. Kurset: programmering i sproget Java. Lærerne: Morten Larsen og Peter Sestoft

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen

Løsning af skyline-problemet

Kursusgang 12. Oversigt: Sidste kursusgang Layout-manager Event-håndtering. Design af brugerflader 12.1

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

Transkript:

= sikkerhed I denne sammenhæng: = "trådsikkerhed" " conditions.. stipulate that nothing bad will ever happen" (XP s. 377) Trådsikkerhed betyder sikkerhed mod inkonsistens pga. flertrådning ikke f.eks. sikkerhed som i "security" dvs. beskyttelse mod hacking Sikkerhed mod inkonsistens pga. flertrådning kan defineres således: flertrådning giver samme resultat som sekventiel udførelse dvs. resultatet af to samtidige kald af kontohæve-metode er det samme som to sekventielle kald præcis definition afhænger af programmets formål Eksempel på inkonsistens (1): To tråde hæver samtidigt: 1000 kr. forsvinder saldo er en delt variabel: begge tråde har adgang til den amount og nysaldo er lokale variable i hæve-metoden Før: saldo = 1000 Tråd 1 hæver 1000: (amount <= saldo) // OK: 1000 <= 1000 nysaldo = 0 // (saldo - amount) saldo = 0 // (saldo = nysaldo) Tråd 2 hæver 1000: (amount <= saldo) // OK: 1000 <= 1000 nysaldo = 0 // (saldo - amount) saldo = 0 // (saldo = nysaldo) Inkonsistens: saldo afspejler ikke hvad der rent faktisk er hævet tid Eksempel på inkonsistens (2): Rod i intern struktur i liste-objekt class Ball {.. void paint(graphics g) {.. class BallList extends LinkedList { void paintballs(graphics g) { // kalder paint() i alle bolde Indsættelse af bolde (LinkedList.put()): bruger trykker på "ekstra bold"-knap bruger vinder ekstra bold Udtagning af bolde (LinkedList.get()): bruger trykker på "fjern bold"-knap bruger spiller dårligt, så bolden "dør"

Intern struktur af objekt-referencer i class BallList (LinkedList) Node Node prev, next Object element redball BallList Node head, tail Node Node prev, next Object element blueball blueball class LinkedList er en dobbelthægtet liste Indsættelse af nyt element består primært i et antal manipulationer af hægterne (prev- og next-referencer). Indsættelse m.m. bør derfor være atomiske operationer En trådsikker liste Overskrivning af add() og get() med synkroniserede metoder Bemærk at definitionen af trådsikker liste er uafhængig af anvendelsen af listen handler alene om den interne struktur af listen (undgå spaghetti) java.util indeholder en række trådsikre Collection-implementationer: Vector og Hashtable er trådsikre LinkedList og ArrayList er ikke trådsikre Manglende trådsikkerhed i eksamensopgave er ikke et problem hvis alle farlige operationer udføres af lytter-metoder da konteksten ikke starter mere end en lytter-metode samtidigt Alligevel: hvordan laves lettest muligt at trådsikker udgave af LinkedList?

Overskrivning af add() Implementation af synchronized class BallList extends LinkedList { synchronized public boolean add(object o) { return super.add(o); Effekten af metode-kvalifikatoren synchronized: Når BallList.add() udføres, sættes en lås på BallList-objektet. Låsen blokerer alle andre tråde, der kalder en synkr. metode på objektet. Når BallList.add() returnerer, frigives låsen hvorefter en af de blokerede metoder aktiveres. f.eks. class BallList Synkronisering er implementeret i class Object For at udføre s. kode: Er låsen ledig? Hvis NEJ: i kø hvis JA tag låsen udfør kode frigiv låsen Grupper af synkroniserede metoder class Konto { synchronized boolean hæv() {.. synchronized boolean indsæt() {.. synchronized void sætrentesats() {.. Metoden sætrentesats() må ikke udføres af mere end 1 tråd samtidigt men gerne samtidigt med hæv()/indsæt() derfor for grovkornet hvis sætrentesats() skal vente på de andre

Finkornet synkronisering class Konto { Object semaphore = new Object();.. synchronized(r) {<kode>.. r er en objekt-reference udførelsen af <kode> er kontrolleret af låsen på det refererede objekt kan være vilkårligt objekt synchronized boolean hæv() {.. synchronized boolean indsæt() {.. void sætrentesats() { synchronized(semaphore) {.. // kan udføres selv om this er låst Trådsikker, "kooperativ" kø Trådsikker kø vhja. class ArrayList Vi vil konstruere en ny datastruktur kø (first in, first out) trådsikker fast størrelse put: hvis kø fuld, så suspender get: hvis kø tom, så suspender jf. Xiaoping s. 380 Trådsikker kø skabes ved udvidelse af class BoundedQueue = en hjemmelavet (XP) kø uden hverken synkronisering eller kommunikation Brug af (wait()) og aktivering (notify()): en mere avanceret form for synkronisering idet det er nødvendigt at trådene samarbejder (kommunikerer) en tråd "notifier" en anden tråd

class BoundedQueue public void put(object o) { if (! isfull()) {.. put o ind bagerst i køen..; public Object get() { if (! isempty()) {.. returner forreste element..; Problem: put: hvis køen er fuld, indsættes element ikke get: hvis køen er tom, returneres intet class BoundedQueueWithGuard ( wait()/notify() ) synchronized public void put(object o) { while (isfull()) try { wait(); // suspenderer (blokerer) en tråd catch (..) {; super.put(o); notify(); // aktiverer (vækker) en tråd synchronized public Object get() { while (isempty()) try { wait(); catch (..) {; Object o = super.get(0); notify(); return o; wait()/notify(): rækkevidde wait()/notify(): implementation synchronized public void put(object o) { while (isfull()) try { wait(); // suspenderer (blokerer) en tråd catch (..) {; super.put(o); notify(); // aktiverer (vækker) en tråd wait()/notify() opererer på intern kø knyttet til det objekt, hvori de kaldes derfor vigtigt at wait()/notify() kaldes i metoder i BoundedQueueWithGuards (ellers kan notify() ikke "ramme") wait() er indeholdt i løkke fordi betingelsen skal testes hver gang på ny muliggør brug af notify()/notifyall() ved hver tilstandsændring

Hvem sættes i kø hvor? "Hvem?" og "hvor?" spørgsmål til synkronisering. Hvem suspenderes? (synchronized, wait()): Det gør tråde - specifikt den tråd som udfører en synchronized metode i et låst objekt eller som udfører et kald af wait(). Hvor anbringes de suspenderede tråde? De tilknyttes det objekt, der indeholder metoden med synchonized / wait(). Rækkevidden af notify() og notifyall() er de (med wait()) suspenderede tråde, som er knyttet til det objekt, der indeholder metoden med notify()/notifyall() wait()/notify(): detaljer synchronized public void put(object o) { while (isfull()) try { wait(); // suspenderer (blokerer) en tråd catch (..) {; super.put(o); notify(); // aktiverer (vækker) en tråd wait() kaster InterruptedException (ligesom sleep()) til fangst af kald af Thread.interrupt() wait() kaldt i synkroniseret metode: synkroniseringslåsen frigives ved wait()-kaldet synkroniseringslåsen skal erobres efter vækning med notify() Blocked waiting waiting for synchronization lock waiting for thread to die sleeping Blokerede tråd-tilstande wait() notify(),notifyall() join() sleep() (time out) Runnable interrupt() Tråd-metoder: på hvilke objekter kaldes de? Blocked waiting... sleeping wait() notify(), notifyall() sleep() (time out) interrupt() Runnable start() Thread, instance method Thread, static method Object, instance method

(jf. Xiaoping) er et løst udtryk for at programmet/trådene før eller siden udfører deres opgave. Problem: undgå forkert brug af tråde, som hindrer at programmet løser sin opgave Brug ikke busy waiting while (isfull); // spild af cpu-tid, kan bremse andre tråde Tornerosesøvn:.. wait();.. // sørg for at this.notify() kaldes af en anden tråd Deadlock Tråd 1 venter på object C (C's synkroniseringslås) Tråd 2 venter på object D (D's synkroniseringslås) Ingen kommer videre, da begge har den lås den anden venter på Eksempel: Tråd 1 kopierer fra Disk C til Disk D Tråd 2 kopierer fra Disk D til Disk C Flere skærmbilleder Spilopgave: Hvordan skifter man mellem forskellige "skærmbilleder", dvs. mellem at vise forskellige grafik-komponenter f.eks. hvor to canvas-objekter viser hver sine bane Ved visning af ny komponent vil vi gerne aktivere nye lyttere og suspendere gamle lyttere Kan gøres ved at gentage registrering / afregistreing af lyttere addmouselistener(), removemouselistener Men det er for omstændeligt (fejlbehæftet, ufleksibelt)

Green Flere skærmbilleder Red RedListener GreenListener GreenListener skal ikke lytte, når rødt canvas er valgt Løsning (1): brug setvisible() i class Component Når en komponent er usynlig, er dens lyttere inaktive Program: // Lyttermetode i lytter, som registrerer knaptryk på rød knap public void actionperformed(actionevent e) { greencanvas.setvisible(false); // deaktivterer lyttere redcanvas.setvisible(true); // aktiverer lyttere Omstændeligt hvis der er mere end to komponenter, der skiftes mellem. Løsning (2): brug layout-manageren CardLayout // panelet som indeholder rød/grøn kanvas // skal "administreres" af CardLayout-manager: CardLayout cardlayout = new CardLayout(); cardpanel.setlayout(cardlayout); // Lyttermetode i lytter, som registrerer knaptryk på rød knap: public void actionperformed(actionevent e) { cardlayout.show(cardpanel,"redcanvas"); // den tidligere viste komponent (redcanvas) skjules automatisk Detaljer om brug af layout-manageren CardLayout public class CardLayoutTester extends Applet { public void init() { /* the cardpanel that shows the red or green canvas */ add(cardpanel = new Panel(),BorderLayout.CENTER); cardpanel.setlayout(cardlayout = new CardLayout()); /* red canvas */ cardpanel.add(redcanvas = new Canvas(),"redCanvas"); redcanvas.setbackground(color.red); redcanvas.addmouselistener(new MouseAdapter() { public void mouseclicked(mouseevent e) { System.out.println("Red canvas caught mouse click"); ); /* controlpanel with buttons */ controlpanel.add(redbutton = new Button("Red")); redbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { cardlayout.show(cardpanel,"redcanvas"); );

Anonyme klasser Bruges ofte til definition af lytter-klasser, hvor man kun skal bruge en instans, og ikke skal referere til instansen. En anonym klasse er en form for indre klasse. En indre klasse er en klasse defineret i en anden klasses indre. Definitionen af en anonym klasse er et udtryk, hvis værdi er en instans af den anonyme klasse. I stedet for - class RedButtonListener implements MouseListener {.. MouseListener listener = new RedButtonListener(); redbutton.addmouselistener(listener); kan man skrive - redbutton.addmouselistener(new MouseListener() {..);