यह लाइब्रेरी एक ही JVM में Java और Kotlin दोनों API को साथ समेटे हुए है। TicketBroker Kotlin कोरूटीन आधारित API है, और BlockingTicketBroker कोरूटीन के बिना उपयोग किया जा सकने वाला Java-अनुकूल ब्लॉकिंग फ़ासाड (java.time.Duration आधारित) है। आंतरिक रूप से दोनों एक ही ब्रोकर को रैप करते हैं।
val broker = TicketBroker.connect("127.0.0.1:5225")
broker.waitReady(5.seconds)
val ticket = broker.acquire("key", 5.seconds, 30.seconds)
ticket.release()
broker.close()समवर्तीता उदाहरण (खाता-वार लॉक से जमा/निकासी का अन्योन्य बहिष्करण):
suspend fun transaction(broker: TicketBroker, account: Int, delta: Long) {
val key = "account-$account"
val ticket = try {
broker.acquire(key, wait, lease)
} catch (e: Exception) {
log.error("account {} acquire failed: {}", account, e.message)
return
}
try {
val before = balances[account]
yield()
balances[account] = before + delta
} finally {
ticket.close() // पृष्ठभूमि में स्वचालित रिलीज़
}
val (action, sign) = if (delta < 0) "withdraw" to '-' else "deposit" to '+'
log.info("account $account $action $sign\$$AMOUNT -> \$${balances[account]}")
}try (BlockingTicketBroker broker = BlockingTicketBroker.connect(List.of("127.0.0.1:5225"))) {
broker.waitReady(Duration.ofSeconds(5));
BlockingTicket ticket = broker.acquire("key", Duration.ofSeconds(5), Duration.ofSeconds(30));
ticket.release();
System.out.println("pass");
}समवर्तीता उदाहरण (खाता-वार लॉक, ExecutorService से कई थ्रेड में समवर्ती निष्पादन):
void transaction(BlockingTicketBroker broker, int account, long delta) {
String key = "account-" + account;
try (BlockingTicket ticket = broker.acquire(key, WAIT, LEASE)) {
long before = balances[account];
Thread.yield();
balances[account] = before + delta;
}
String action = delta < 0 ? "withdraw" : "deposit";
char sign = delta < 0 ? '-' : '+';
log.info("account {} {} {}${} -> ${}", account, action, sign, AMOUNT, balances[account]);
}पूर्ण उदाहरण ExampleSimpleTest.kt / ExampleBankTest.kt (Kotlin), ExampleSimpleJavaTest.java / ExampleBankJavaTest.java (Java) में देखें।