10 Lock Lock-lause

Samankaltaiset tiedostot
5 Näppäimistö. 5.1 Näppäimistön eventit

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen

Rinnakkaisuus (.NET) Juha Järvensivu 2007

Rinnakkaisohjelmointi, Syksy 2006

Olio-ohjelmointi Javalla

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

T Henkilökohtainen harjoitus: FASTAXON

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Ohjelmointi 2 / 2010 Välikoe / 26.3

Mikä yhteyssuhde on?

14. Poikkeukset 14.1

C# Windows ohjelmointi perusopas

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

XNA grafiikka laajennus opas. Paavo Räisänen. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

Jaana Diakite Projekti 1 JAVA-Monitorit 1(13) Rinnakkaisohjelmointi Anu Uusitalo

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

C# olio-ohjelmointi perusopas

Sisältö. 22. Taulukot. Yleistä. Yleistä

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

7. Oliot ja viitteet 7.1

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Sisällys. 15. Lohkot. Lohkot. Lohkot

Poikkeustenkäsittely

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

RINNAKKAINEN OHJELMOINTI A,

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisältö. 2. Taulukot. Yleistä. Yleistä

Javan semaforit. Joel Rybicki, Aleksi Nur mi, Jara Uitto. Helsingin yliopisto

Graafisen käyttöliittymän ohjelmointi Syksy 2013

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Muuttujat ja kontrolli. Ville Sundberg

Delegaatit ja tapahtumakäsittelijät

Web Services tietokantaohjelmoinnin perusteet

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ohjelmoinnin peruskurssien laaja oppimäärä

Web järjestelmän ohjelmointi Kevät 2012 Hans Nieminen

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

1 Tehtävän kuvaus ja analysointi

Tietokannat II -kurssin harjoitustyö

11. Javan toistorakenteet 11.1

9. Periytyminen Javassa 9.1

JAVA-OHJELMOINTI 3 op A274615

C++11 seminaari, kevät Johannes Koskinen

Javan perusteita. Janne Käki

Mitä poikkeuskäsittely tarkoittaa?

Metodien tekeminen Javalla

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Java-kielen perusteet

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Luokan sisällä on lista

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Asynkroninen ohjelmointi.net 4.5 versiolla

Monitorit -projekti Rinnakkaisohjelmointi

Ohjelmoinnin perusteet, kurssikoe

12. Näppäimistöltä lukeminen 12.1

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Listarakenne (ArrayList-luokka)

Java ja tietokannan käsittely (JDBC)

12. Javan toistorakenteet 12.1

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

9. Periytyminen Javassa 9.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

12. Javan toistorakenteet 12.1

C# ja.net. Juha Järvensivu 2007

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

8. Näppäimistöltä lukeminen 8.1

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Valikot ja työkalupalkit. 2008

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

Leikepöydän käyttö.net ja QT. Juha Järvensivu 2008

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Sisällys. 16. Lohkot. Lohkot. Lohkot

5/20: Algoritmirakenteita III

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Java ja grafiikka. Ville Sundberg

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Java-API, rajapinnat, poikkeukset, UML,...

Java kahdessa tunnissa. Jyry Suvilehto

public static void main (String [] args)

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Olio-ohjelmointi Virhetilanteiden käsittely

Ehto- ja toistolauseet

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

Testivetoinen ohjelmistokehitys

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Java-kielen perusteita

Transkriptio:

10 Lock Avainsanan lock (Lock keyword) avulla voidaan toteuttaa prosessien ja säikeiden välisessä keskinäisessä kommunikoinnissa käytettäviä synkronointi- ja poissuljentarakenteita. Tämän niin sanotun Lock-lauseen avulla voidaan kontrolloida säikeiden pääsyä suorittamaan kriittisen alueen ohjelmakoodia. Lock-lauseen (lockstatement) avulla voidaan toteuttaa näitä kriittisiä ohjelmalohkoja, joissa olevaa ohjelmakoodia pääsee suorittamaan vain yksi säie kerrallaan. Nämä ohjelmalohkot suoritetaan siten, että toiset säikeet eivät pääse keskeyttämään suoritusta ennen, kuin koko lohko on kokonaan suoritettu loppuun kyseisen säikeen toimesta. Kuva 10-1 havainnollistaa lock-lauseen käyttöä. Kuva 10-1. Lock-lauseen käyttö. 10.1 Lock-lause Lock-lause voidaan toteuttaa lock-avainsanan avulla. Lock-lauseen avulla voidaan toteuttaa synkronointi-/poissuljentarakenne eli tässä tapauksessa ohjelmalohko, jossa olevaa ohjelmakoodia pääsee suorittamaan vain yksi säie kerrallaan. Lock-lauseen toteuttamisessa tarvitaan lukitusobjektia. Lukitusobjekti on mikä tahansa objekti, joka on kyseisen lock-lauseen näkyvyysalueella. Tavallisesti lukitusobjekti on kuitenkin kyseistä lock-lausetta varten luotu Object-tyyppinen olio. Lock-lause toimii siten, että jos jokin säie on suorittamassa Lock-lauseella suojattua ohjelmalohkoa ja samaan aikaan toinen säie yrittää päästä suorittamaan samalla lukitusobjektilla suojattua samaa tai eri ohjelmalohkoa, niin se pysäytetään, siksi aikaa kunnes kyseinen lukitusobjekti vapautuu eli ensimmäinen kyseistä ohjelmalohkoa suorittamassa oleva säie lopettaa Lock-lauseella suojatun lohkon suorittamisen ja vapauttaa lukitusobjektin ja näin koko lohkon. Lukitusobjektin näkyvyysalue määrää sen, missä rakenteissa sitä voidaan käyttää. Lock-lauseen saa toteutettua siten, että ensin luodaan lukitusobjekti ja sitten käytetään tätä objektia lock-lohkon lukituksessa. www.stickmansoft.com 273

Object lockobject = new Object(); lock (lockobject) // Only one thread at a time may execute this statement. 10.1.1 OsLock-ohjelma OsLock-ohjelma on esimerkki sitä, kuinka lock-avainsanaa käytetään Lock-lauseen toteuttamisessa. Ohjelmassa luodaan kaksi säiettä ohjelman käynnistyksen yhteydessä. Molemmat säikeet liikuttavat omaa ufoa näytöllä. Lock-lauseen avulla säikeiden ufon liikutuksen hoitava osa ohjelmakoodista on sijoitettu Lock-lauseella suojattuun lohkoon. Tällöin vain toinen säie voi liikuttaa omaa ufoaan ja toinen säie joutuu odottamaan vuoro eli Lock-lohkon vapautumista toiselta säikeeltä. Tämä Lock-lauseella suojattu lohko simuloi tässä ohjelmassa kriittistä aluetta eli aluetta, jota saa suorittaa vain yksi säie kerrallaan. Ohjelma koostuu Program.cs-tiedostosta, formista ja siihen liitetystä OsForm.cs-lähdetekstitiedostosta sekä erillisestä Ufo.cs-luokkatiedostosta. Seuraavassa on esitelty edellä mainittujen lähdetekstitiedostojen sisältämät ohjelmakoodit. Program.cs Program.cs-lähdetekstitiedosto sisältää Main()-metodin eli ohjelman aloituskohdan. Kuvassa 10-2 on esitetty Program.cs-tiedoston ohjelmakoodi. /* Program.cs Copyright Markku Rahikainen. www.stickmansoft.com */ using System; using System.Collections.Generic; using System.Windows.Forms; namespace OsFrame static class Program static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new OsForm()); Kuva 10-2. OsLock-ohjelman Program.cs-tiedosto. 274 C# Systeemiohjelmointi

OsForm.cs OsForm.cs-lähdetekstitiedosto on ohjelman formiin liitetty lähdetekstitiedosto. Kuvassa 10-3 on esitetty OsForm.cs-tiedoston ohjelmakoodi. /* OsForm.cs Copyright Markku Rahikainen. www.stickmansoft.com */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace OsFrame public partial class OsForm : Form private Object lockobject = new Object(); private Thread ufothread1 = null; private Thread ufothread2 = null; private Boolean ufothreadrunning = false; public OsForm() InitializeComponent(); // Create a thread 1. ufothread1 = new Thread(new ParameterizedThreadStart(UfoProcedure)); ufothread1.start("ufo1"); // Create a thread 2. ufothread2 = new Thread(new ParameterizedThreadStart(UfoProcedure)); ufothread2.start("ufo2"); private void OsMenuFileExit_Click(object sender, EventArgs e) ApplicationExit(); private void OsForm_FormClosing(object sender, FormClosingEventArgs e) ApplicationExit(); www.stickmansoft.com 275

private void ApplicationExit() ufothreadrunning = false; Application.Exit(); private void UfoProcedure(object Data) Ufo ufo = new Ufo(Convert.ToString(Data)); ufothreadrunning = true; Random Rand = new Random(DateTime.Now.Millisecond); while (ufothreadrunning) // Blocks the thread until // block is released. lock (lockobject) int i = 100; while (i > 0 && ufothreadrunning) i--; ufo.movetheufo(clientsize, OsMenu.Height); ufo.drawtheufo(creategraphics()); Thread.Sleep(Rand.Next(10, 50)); Thread.Sleep(0); Kuva 10-3. OsLock-ohjelman Program.cs-tiedosto. Ufo.cs Ufo.cs-lähdetekstitiedosto sisältää luokan ufon käsittelyyn. Luokassa on ohjelmarakenteet ufo-kuvan lataamista, ufon liikuttamista ja ufon näytölle tulostamista varten. Kuvassa 10-4 on esitetty Ufo.cs-tiedoston ohjelmakoodi. /* Ufo.cs Copyright Markku Rahikainen. www.stickmansoft.com */ using System; using System.Collections.Generic; using System.Text; 276 C# Systeemiohjelmointi

using System.Drawing; using System.Windows.Forms; namespace OsFrame class Ufo private Image ufo; private int xpos = 50; private int xspeed = 1; private int xdir = 1; private int ypos = 50; private int yspeed = 1; private int ydir = 1; public Ufo() public Ufo(string Ufo) try // Load background. background = new Bitmap("..\\..\\UfoBackground.gif"); // Load a ufo image. ufo = new Bitmap("..\\..\\" + Ufo + ".gif"); catch (Exception ex) MessageBox.Show("Error: " + ex.tostring(), "Ufo load failed"); ~Ufo() // Release ufo. ufo.dispose(); public void MoveTheUfo(Size ClientSize, int MenuHeight) // Update UFO y position. xpos += xspeed * xdir; if (xpos < 0 xpos > ClientSize.Width - ufo.width) xdir *= -1; // Update UFO x position. ypos += yspeed * ydir; www.stickmansoft.com 277

if (ypos < MenuHeight ypos > ClientSize.Height - ufo.height) ydir *= -1; public void DrawTheUfo(Graphics Graf) // Draw ufo to the screen. Graf.Clear(Color.White); Graf.DrawImage(ufo, xpos, ypos); Graf.Dispose(); Kuva 10-4. OsLock-ohjelman Ufo.cs-tiedosto. Kun OsLock-projektin toteuttaa, suorittaa ohjelman kääntämisen ja käynnistää ohjelman, niin näyttö on kuvan 10-5 mukainen. Kuva 10-5. OsLock-ohjelman tulostus. 278 C# Systeemiohjelmointi