package Ġkotlin lang _ org . coroutines Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels . actor Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ / ******** ** Ġdemo Ġ 1 Ġ********* */ Ċ // var Ġcounter Ġ= Ġ 0 ĊĊ Ċ / ******** ** Ġdemo Ġ 2 Ġ********* */ Ċ //@ Volatile Ċ // var Ġcounter Ġ= Ġ 0 ĊĊ Ċ / ******** ** Ġdemo Ġ 3 Ġ********* */ Ċ // var Ġcounter Ġ= ĠAtomicInteger ( 0 ) ĊĊ Ċ / ******** ** Ġdemo Ġ 4 , 5 Ġ********* */ Ċ // var Ġcounter Ġ= Ġ 0 Ċ // val Ġcounter Context Ġ= Ġnew Single Thread Context (" Counter Context ") ĊĊ Ċ / ******** ** Ġdemo Ġ 6 Ġ********* */ Ċ var Ġcounter Ġ= Ġ 0 Ċ val Ġmutex Ġ= ĠMutex () ĊĊ Ċ fun Ġmain ( args : ĠArray < String >) Ġ= Ġrun Blocking < Unit > Ġ{ ĊĠĠĠ Ġ/ ******** ** Ġdemo Ġ 1 , 2 , 3 Ġ********* */ Ċ // ĠĠĠ ĠGlobal Scope . mass ive Run Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġcounter . increment AndGet () Ċ // ĠĠĠ Ġ} Ċ // ĠĠĠ Ġprintln (" Counter Ġ= Ġ$ counter ") ĊĊĊĠĠĠ Ġ/ ******** ** Ġdemo Ġ 4 Ġ********* */ Ċ // ĠĠĠ ĠGlobal Scope . mass ive Run Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġwith Context ( counter Context ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcounter ++ Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // ĠĠĠ Ġprintln (" Counter Ġ= Ġ$ counter ") ĊĊĊĠĠĠ Ġ/ ******** ** Ġdemo Ġ 5 Ġ********* */ Ċ // ĠĠĠ ĠCor outine Scope ( counter Context ). mass ive Run Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġcounter ++ Ċ // ĠĠĠ Ġ} Ċ // ĠĠĠ Ġprintln (" Counter Ġ= Ġ$ counter ") ĊĊĊĠĠĠ Ġ/ ******** ** Ġdemo Ġ 6 Ġ********* */ Ċ // ĠĠĠ ĠGlobal Scope . mass ive Run Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcounter ++ Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // ĠĠĠ Ġprintln (" Counter Ġ= Ġ$ counter ") ĊĊĊĠĠĠ Ġ/ ******** ** Ġdemo Ġ 7 Ġ********* */ ĊĠĠĠ Ġval Ġcounter Ġ= Ġcounter Actor () Ġ// Ġcreate Ġthe Ġactor ĊĠĠĠ ĠGlobal Scope . mass ive Run Ġ{ ĊĠĠĠĠĠĠĠ Ġcounter . send ( Inc Counter ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġsend Ġa Ġmessage Ġto Ġget Ġa Ġcounter Ġvalue Ġfrom Ġan Ġactor ĊĠĠĠ Ġval Ġresponse Ġ= ĠComp letable Deferred < Int >() ĊĠĠĠ Ġcounter . send ( Get Counter ( response )) ĊĠĠĠ Ġprintln (" Counter Ġ= Ġ${ response . await () }") ĊĠĠĠ Ġcounter . close () Ġ// Ġshutdown Ġthe Ġactor Ċ } ĊĊ Ċ / ******** ** Ġdemo Ġ 1 , 2 , 3 , 4 , 5 , 6 , 7 Ġ********* */ Ċ suspend Ġfun ĠCor outine Scope . mass ive Run ( action : Ġsuspend Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġn Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġval Ġk Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjobs Ġ= ĠList ( n ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( k ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjobs . forEach Ġ{ Ġit . join () Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" Completed Ġ${ n Ġ* Ġk } Ġactions Ġin Ġ$ time Ġms ") Ċ } ĊĊ Ċ / ******** ** Ġdemo Ġ 7 Ġ********* */ Ċ // ĠMessage Ġtypes Ġfor Ġcounter Actor Ċ sealed Ġclass ĠCounter Msg Ċ Ċ object ĠInc Counter Ġ: ĠCounter Msg () Ġ// Ġone - way Ġmessage Ġto Ġincrement Ġcounter Ċ class ĠGet Counter ( val Ġresponse : ĠComp letable Deferred < Int >) Ġ: ĠCounter Msg () Ġ// Ġa Ġrequest Ġwith Ġreply Ċ Ċ // ĠThis Ġfunction Ġla unches Ġa Ġnew Ġcounter Ġactor Ċ fun ĠCor outine Scope . counter Actor () Ġ= Ġactor < Counter Msg > Ġ{ ĊĠĠĠ Ġvar Ġcounter Ġ= Ġ 0 Ġ// Ġactor Ġstate ĊĠĠĠ Ġfor Ġ( msg Ġin Ġchannel ) Ġ{ Ġ// Ġiterate Ġover Ġincoming Ġmessages ĊĠĠĠĠĠĠĠ Ġwhen Ġ( msg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInc Counter Ġ-> Ġcounter ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGet Counter Ġ-> Ġmsg . response . complete ( counter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }