package Ġme . jiang ca i . common . bs Ċ Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . test . context . Context Configuration Ċ import Ġorg . springframework . test . context . junit 4 . Spring JUnit 4 Class Runner Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Semaphore Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* Ġ åįķ ä¸ª æµĭè¯ķ å°± æ¯Ķè¾ĥ ç®Ģåįķ ãĢĤ Ċ Ġ* Ċ Ġ* Ġ@ author ĠC J Ċ Ġ*/ Ċ @ RunWith ( Spring JUnit 4 Class Runner :: class ) Ċ @ Context Configuration ( classes Ġ= Ġ[ Make Business Safe Config Test :: class ]) Ċ class ĠSingle Locker Test Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclassic Service : ĠClass ic Service ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgo () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġæ Ļ ® éĢļ çļĦæĸ¹æ³ķ ï¼Į å¿ħ çĦ¶ å¹¶ åıĳ æ·· ä¹± ĊĠĠĠĠĠĠĠ Ġconcurrent Logic ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclassic Service . contact With Memory ( it ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( classic Service . contact With Memory ("")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isNot EqualTo ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ å®īåħ¨ çļĦæĸ¹æ³ķ ï¼Į åĢ¼ å¾Ĺ ä¾Ŀèµĸ ĊĠĠĠĠĠĠĠ Ġconcurrent Logic ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclassic Service . contact With Memory In Lock ( it ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( classic Service . contact With Memory In Lock ("")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠåĴĮ æķ°æį®åºĵ äºĭåĬ¡ çļĦ èģĶ åĲĪ æī§ æ³ķ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwith Tx () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġclassic Service . init () ĊĊĠĠĠĠĠĠĠ Ġ// Ġæ Ļ ® éĢļ çļĦæĸ¹æ³ķ ï¼Į å¿ħ çĦ¶ å¹¶ åıĳ æ·· ä¹± ĊĠĠĠĠĠĠĠ Ġconcurrent Logic ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclassic Service . add Name To Simple ( it ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( classic Service . add Name To Simple ("")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isNot EqualTo ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ å®īåħ¨ çļĦæĸ¹æ³ķ ï¼Į åĢ¼ å¾Ĺ ä¾Ŀèµĸ ĊĠĠĠĠĠĠĠ Ġconcurrent Logic ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclassic Service . add Name To Simple In Lock ( it ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( classic Service . add Name To Simple In Lock ("")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠåĴĮ æķ°æį®åºĵ äºĭåĬ¡ çļĦ èģĶ åĲĪ æī§ æ³ķ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å®ŀ æĸ½ ä¸Ģä¸ª å¹¶ åıĳ æĵįä½ľ ĊĠĠĠĠ Ġ* Ġ@ param Ġwork Ġ å·¥ä½ľ èĢħ ĊĠĠĠĠ Ġ* Ġ@ param Ġresult Ġ æł¡éªĮ èĢħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconcurrent Logic ( work : Ġ( String ) Ġ-> ĠUnit , Ġresult : Ġ(( except ed : ĠString ) Ġ-> ĠUnit )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= ĠRandom ( System . currentTimeMillis ()). nextInt ( 1 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Fixed ThreadPool ( count ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsemaphore Ġ= ĠSem aphore ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġword Ġ= Ġ" h " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemaphore . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsemaphore . acquire ( count ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ( word . repeat ( count )) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . shutdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }