# blocking

Published articles for blocking.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Cloudflare adds controls to allow search indexing while disallowing AI training

DevFeed: [Cloudflare adds controls to allow search indexing while disallowing AI training](<https://devfeed.tech/articles/have-it-both-ways-stay-discoverable-in-search-while-disallowing-ai-training-26580.md>)

Original publisher: [Read original article](<https://blog.cloudflare.com/accountable-mixed-use-ai-crawlers/>)

Author: Bryan Becker

Published: 2026-09-15T13:00:00Z

Content type: release

Language: en

Sources: [Cloudflare Blog](<https://devfeed.tech/sources/cloudflare-blog.md>)

Topics: [Cloudflare](<https://devfeed.tech/topics/cloudflare.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Crawler](<https://devfeed.tech/topics/crawler.md>), [Google](<https://devfeed.tech/topics/google.md>), [Microsoft](<https://devfeed.tech/topics/microsoft.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [ai-bots](<https://devfeed.tech/tags/ai-bots.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [bot-management](<https://devfeed.tech/tags/bot-management.md>), [bots](<https://devfeed.tech/tags/bots.md>), [cloudflare](<https://devfeed.tech/tags/cloudflare.md>), [content](<https://devfeed.tech/tags/content.md>), [google](<https://devfeed.tech/tags/google.md>), [internet](<https://devfeed.tech/tags/internet.md>), [microsoft](<https://devfeed.tech/tags/microsoft.md>), [network-services](<https://devfeed.tech/tags/network-services.md>), [product-news](<https://devfeed.tech/tags/product-news.md>), [search](<https://devfeed.tech/tags/search.md>), [security](<https://devfeed.tech/tags/security.md>)

### AI overview

Cloudflare announces a Disallow AI Training setting that lets website owners remain indexed in search while refusing AI training by mixed-use crawlers. Apple, Google, and Microsoft honor or have committed to honor the setting.

### Source excerpt

Cloudflare is giving site owners a way to stay discoverable while disallowing AI training. New controls and an Accountable designation establish a shared model with Apple, Google, and Microsoft.

## How Solaris' Turnstile Influenced the Modern System Designs of Web Browsers and Language Runtimes

DevFeed: [How Solaris' Turnstile Influenced the Modern System Designs of Web Browsers and Language Runtimes](<https://devfeed.tech/articles/how-solaris-turnstile-influenced-the-modern-system-designs-of-web-browsers-and-language-runtimes-26602.md>)

Original publisher: [Read original article](<https://www.infoq.com/news/2026/09/turnstile-system-design/>)

Author: Olimpiu Pop

Published: 2026-09-15T06:06:00Z

Content type: article

Language: en

Sources: [InfoQ](<https://devfeed.tech/sources/infoq.md>)

Topics: [systems](<https://devfeed.tech/topics/systems.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Kernel](<https://devfeed.tech/topics/kernel.md>), [observability](<https://devfeed.tech/topics/observability.md>), [browsers](<https://devfeed.tech/topics/browsers.md>), [web browsers](<https://devfeed.tech/topics/web-browsers.md>)

Tags: [architecture](<https://devfeed.tech/tags/architecture.md>), [architecture-design](<https://devfeed.tech/tags/architecture-design.md>), [architectures](<https://devfeed.tech/tags/architectures.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [development](<https://devfeed.tech/tags/development.md>), [efficiency](<https://devfeed.tech/tags/efficiency.md>), [kernel](<https://devfeed.tech/tags/kernel.md>), [locking](<https://devfeed.tech/tags/locking.md>), [memory](<https://devfeed.tech/tags/memory.md>), [news](<https://devfeed.tech/tags/news.md>), [observability](<https://devfeed.tech/tags/observability.md>), [operating-systems](<https://devfeed.tech/tags/operating-systems.md>), [solaris](<https://devfeed.tech/tags/solaris.md>), [storage](<https://devfeed.tech/tags/storage.md>), [systems](<https://devfeed.tech/tags/systems.md>), [turnstile-system-design](<https://devfeed.tech/tags/turnstile-system-design.md>)

### AI overview

The article examines how Solaris innovations influenced modern systems engineering. It discusses the Slab Allocator, OpenZFS, DTrace, Zones, and turnstiles, focusing on how turnstiles reduce per-lock memory overhead while supporting priority inheritance for contended locks.

### Source excerpt

Sun's Solaris influenced modern systems engineering, with key innovations like the Slab Allocator for efficient memory management, OpenZFS for advanced storage, and DTrace for observability. Its turnstile mechanism addressed issues with mutexes, promoting lean locking designs that are reflected in contemporary programming languages and web browsers, enhancing performance and memory efficiency. By Olimpiu Pop

## Why your Redis is slow: it is single threaded and you sent it KEYS

DevFeed: [Why your Redis is slow: it is single threaded and you sent it KEYS](<https://devfeed.tech/articles/why-your-redis-is-slow-it-is-single-threaded-and-you-sent-it-keys-39605.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/53-redis-single-threaded-keys-command/>)

Author: hello@ankit-rana.com

Published: 2026-09-15T00:00:00Z

Content type: tutorial

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [Redis](<https://devfeed.tech/topics/redis.md>), [Latency](<https://devfeed.tech/topics/latency.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>)

Tags: [blocking](<https://devfeed.tech/tags/blocking.md>), [caching](<https://devfeed.tech/tags/caching.md>), [command](<https://devfeed.tech/tags/command.md>), [latency](<https://devfeed.tech/tags/latency.md>), [observability](<https://devfeed.tech/tags/observability.md>), [performance](<https://devfeed.tech/tags/performance.md>), [redis](<https://devfeed.tech/tags/redis.md>), [single-threaded](<https://devfeed.tech/tags/single-threaded.md>)

### AI overview

The article explains that Redis executes commands one at a time on a single thread, so expensive commands can block every client and cause latency spikes across all operations. It identifies KEYS as a key offender and also discusses large DEL operations, unbounded LRANGE, SMEMBERS on large sets, and FLUSHALL. Redis 6 threaded I/O helps with socket handling but does not change single-threaded command execution.

### Source excerpt

Redis executes commands one at a time on a single thread, so any command that takes 200ms makes every other client wait 200ms regardless of how trivial their request was. KEYS scans the entire keyspace and is the obvious offender, but DEL on a large collection, unbounded LRANGE, SMEMBERS on a big set and FLUSHALL are all linear in the size of the data and block identically. The tell is a latency spike across all operations at once while CPU and network look normal.

## Top System Design Performance Metrics

DevFeed: [Top System Design Performance Metrics](<https://devfeed.tech/articles/top-system-design-performance-metrics-34692.md>)

Original publisher: [Read original article](<https://newsletter.systemdesigncodex.com/p/top-system-design-performance-metrics>)

Author: Saurabh Dashora

Published: 2026-07-14T08:36:41Z

Content type: tutorial

Language: en

Sources: [System Design Codex](<https://devfeed.tech/sources/system-design-codex.md>)

Topics: [benchmarking](<https://devfeed.tech/topics/benchmarking.md>), [Availability](<https://devfeed.tech/topics/availability.md>), [Architecture & Design](<https://devfeed.tech/topics/architecture-design.md>), [Scalability](<https://devfeed.tech/topics/scalability.md>), [Load Balancing](<https://devfeed.tech/topics/load-balancing.md>), [health checks](<https://devfeed.tech/topics/health-checks.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Disaster Recovery](<https://devfeed.tech/topics/disaster-recovery.md>), [Database](<https://devfeed.tech/topics/database.md>), [sharding](<https://devfeed.tech/topics/sharding.md>), [IO](<https://devfeed.tech/topics/io.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [availability](<https://devfeed.tech/tags/availability.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [database](<https://devfeed.tech/tags/database.md>), [disaster-recovery](<https://devfeed.tech/tags/disaster-recovery.md>), [health-checks](<https://devfeed.tech/tags/health-checks.md>), [load-balancing](<https://devfeed.tech/tags/load-balancing.md>), [performance](<https://devfeed.tech/tags/performance.md>), [performance-metrics](<https://devfeed.tech/tags/performance-metrics.md>), [scalability](<https://devfeed.tech/tags/scalability.md>), [sharding](<https://devfeed.tech/tags/sharding.md>), [system-design](<https://devfeed.tech/tags/system-design.md>)

### AI overview

A tutorial on system design performance metrics, focusing on availability and throughput. It explains how these metrics are measured and outlines techniques such as load balancing, health checks, failover, redundancy, disaster recovery, query optimization, sharding, and asynchronous processing.

### Source excerpt

Must Know Metrics

## Your robots.txt Says Yes. Your Firewall Says 403.

DevFeed: [Your robots.txt Says Yes. Your Firewall Says 403.](<https://devfeed.tech/articles/your-robots-txt-says-yes-your-firewall-says-403-30874.md>)

Original publisher: [Read original article](<https://brent.leekley.me/blog/robots-vs-firewall/>)

Author: Brent Leekley

Published: 2026-06-11T00:00:00Z

Content type: article

Language: en

Sources: [brent.leekley.me blog](<https://devfeed.tech/sources/brent-leekley-me-blog.md>)

Topics: [Cloudflare](<https://devfeed.tech/topics/cloudflare.md>), [AI Bots](<https://devfeed.tech/topics/ai-bots.md>), [AI search](<https://devfeed.tech/topics/ai-search.md>), [Crawler](<https://devfeed.tech/topics/crawler.md>), [Firewall](<https://devfeed.tech/topics/firewall.md>)

Tags: [403](<https://devfeed.tech/tags/403.md>), [aeo](<https://devfeed.tech/tags/aeo.md>), [ai-bots](<https://devfeed.tech/tags/ai-bots.md>), [ai-crawl-control](<https://devfeed.tech/tags/ai-crawl-control.md>), [ai-crawlers](<https://devfeed.tech/tags/ai-crawlers.md>), [ai-search](<https://devfeed.tech/tags/ai-search.md>), [ai-visibility](<https://devfeed.tech/tags/ai-visibility.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [bot-management](<https://devfeed.tech/tags/bot-management.md>), [chatgpt-user](<https://devfeed.tech/tags/chatgpt-user.md>), [cloudflare](<https://devfeed.tech/tags/cloudflare.md>), [firewall](<https://devfeed.tech/tags/firewall.md>), [gptbot](<https://devfeed.tech/tags/gptbot.md>), [oai-searchbot](<https://devfeed.tech/tags/oai-searchbot.md>), [perplexity](<https://devfeed.tech/tags/perplexity.md>), [robots](<https://devfeed.tech/tags/robots.md>), [robots-txt](<https://devfeed.tech/tags/robots-txt.md>)

### AI overview

A field note explains how a Cloudflare AI-bot blocking setting returned 403 responses to all AI agents even though the site's robots.txt allowed AI search and blocked training crawlers. It distinguishes training crawlers, search indexers, and user-triggered fetchers, and recommends auditing enforcement at the firewall layer.

### Source excerpt

A client's robots.txt welcomed AI search and blocked training crawlers, but Cloudflare's blunt AI-bot toggle was returning 403 to every AI agent at the edge. How the block was found, the AI Crawl Control fix, and why you should audit enforcement, not intent.

## From Drift to Direction: The Architecture Behind Digression Control (Role Play)

DevFeed: [From Drift to Direction: The Architecture Behind Digression Control (Role Play)](<https://devfeed.tech/articles/from-drift-to-direction-the-architecture-behind-digression-control-role-play-26353.md>)

Original publisher: [Read original article](<https://medium.com/udemy-engineering/from-drift-to-direction-the-architecture-behind-digression-control-role-play-1720d9a3a6a0?source=rss----19c6d3367ed4---4>)

Author: Raka Dalal

Published: 2026-04-09T12:25:37Z

Content type: article

Language: en

Sources: [Udemy Engineering](<https://devfeed.tech/sources/udemy-engineering.md>)

Topics: [Large Language Model](<https://devfeed.tech/topics/llm.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [systems](<https://devfeed.tech/topics/systems.md>), [Learning](<https://devfeed.tech/topics/learning.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [conversational-ai](<https://devfeed.tech/tags/conversational-ai.md>), [data-science](<https://devfeed.tech/tags/data-science.md>), [large-language-models](<https://devfeed.tech/tags/large-language-models.md>), [learning](<https://devfeed.tech/tags/learning.md>), [llm](<https://devfeed.tech/tags/llm.md>), [llm-evaluation](<https://devfeed.tech/tags/llm-evaluation.md>), [prompt-engineering](<https://devfeed.tech/tags/prompt-engineering.md>), [systems](<https://devfeed.tech/tags/systems.md>)

### AI overview

Udemy's Role Play experience uses open-ended LLM-mediated conversations for practice with defined learning goals. The article examines digression as a systems challenge and introduces a Response Steering Layer intended to preserve conversational naturalness while improving goal adherence.

### Source excerpt

Role Play @UdemyIntroduction AI-powered role play systems aim to recreate one of the most effective learning modalities: practicing real-world conversations in a safe, repeatable environment. In Udemy's Role Play experience, learners engage in open-ended, free-text dialogues with an AI character that embodies a specific persona -- such as an interviewer, a stakeholder, or a customer -- while working toward clearly defined learning goals. This contrasts with many traditional digital learning tools, which rely on static content, multiple-choice interactions, or scripted simulations that limit conversational variability. This design prioritizes realism and skill transfer, allowing learners to respond naturally rather than selecting from predefined options. Open-ended conversations mediated by LLM-based systems, however, introduce a core systems challenge: digression. In real conversations, people may drift off-topic, but human tutors actively manage and redirect such drift. In a learning-oriented role play mediated by an AI system, persistent digressions undermine the experience in more subtle but consequential ways. Learners may shift into meta-conversations, attempt to override the role being played, or explore tangents unrelated to the scenario's objectives. When this happens, learning goals become harder to assess, feedback loses grounding in the conversation, and the interaction no longer reflects the real-world situation the learner is meant to practice. A naive solution is to tightly constrain the conversation -- blocking inputs, rejecting turns, or forcing the dialogue back onto a scripted path. While this approach improves goal adherence, it comes at the cost of immersion and learner agency. Overly rigid controls make the AI feel less like a conversational partner and more like an instructional interface. On the other hand, allowing unrestricted conversational freedom preserves naturalness but leads to goal drift, inconsistent learning signals, and reduced reliab

## Don't Block Suspend Functions

DevFeed: [Don't Block Suspend Functions](<https://devfeed.tech/articles/don-t-block-suspend-functions-32247.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/01/22/dont-block-suspend-functions/>)

Author: Jesse Wilson

Published: 2026-01-22T04:32:49Z

Content type: tutorial

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [async](<https://devfeed.tech/topics/async.md>), [Job](<https://devfeed.tech/topics/job.md>), [IO](<https://devfeed.tech/topics/io.md>)

Tags: [async](<https://devfeed.tech/tags/async.md>), [await](<https://devfeed.tech/tags/await.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [blog-post](<https://devfeed.tech/tags/blog-post.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [dispatcher](<https://devfeed.tech/tags/dispatcher.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [thread](<https://devfeed.tech/tags/thread.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

This Kotlin tutorial explains why blocking calls inside suspend functions can prevent other coroutines from running. It contrasts preemptive thread concurrency with cooperative coroutine concurrency and recommends avoiding blocking functions in suspending code, using the I/O dispatcher when necessary, and avoiding runBlocking.

### Source excerpt

Here's a program that launches 3 jobs. The first runs forever and the other two exchange a value. @Test fun test() = runTest { val channel = Channel<String>() val deferredA = async { while (isActive) { delay(1_000) } } val deferredB = async { channel.send("hello") } val deferredC = async { channel.receive() } deferredB.await(

## Suspending functions into blocking functions or CompletableFuture

DevFeed: [Suspending functions into blocking functions or CompletableFuture](<https://devfeed.tech/articles/suspending-functions-into-blocking-functions-or-completablefuture-39325.md>)

Original publisher: [Read original article](<https://kt.academy/article/interop-coroutines-to-blocking>)

Published: 2025-09-29T00:00:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Java](<https://devfeed.tech/topics/java.md>), [functions](<https://devfeed.tech/topics/functions.md>)

Tags: [blocking](<https://devfeed.tech/tags/blocking.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [guide](<https://devfeed.tech/tags/guide.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

A guide to converting suspending functions into blocking functions or CompletableFuture in Kotlin Coroutines, with advice for APIs used by Java or non-coroutine Kotlin callers.

### Source excerpt

A guide on how to correctly convert suspending functions into blocking functions or CompletableFuture in Kotlin Coroutines.

## runBlocking in practice: Where it should be used and where not

DevFeed: [runBlocking in practice: Where it should be used and where not](<https://devfeed.tech/articles/runblocking-in-practice-where-it-should-be-used-and-where-not-39373.md>)

Original publisher: [Read original article](<https://kt.academy/article/run_blocking>)

Published: 2025-09-01T00:00:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [runBlocking](<https://devfeed.tech/topics/runblocking.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [async](<https://devfeed.tech/tags/async.md>), [await](<https://devfeed.tech/tags/await.md>), [best-practices](<https://devfeed.tech/tags/best-practices.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [dispatcher](<https://devfeed.tech/tags/dispatcher.md>), [guide](<https://devfeed.tech/tags/guide.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [pitfalls](<https://devfeed.tech/tags/pitfalls.md>), [retrofit](<https://devfeed.tech/tags/retrofit.md>), [runblocking](<https://devfeed.tech/tags/runblocking.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

A practical guide to runBlocking in Kotlin Coroutines. It explains how runBlocking converts suspending calls into blocking calls, blocks the calling thread until completion, and creates a new coroutine hierarchy. The article discusses appropriate uses, code smells, and alternatives, including an Android Retrofit interceptor example.

### Source excerpt

A comprehensive guide to using runBlocking in Kotlin Coroutines, including best practices and common pitfalls.

## Calling blocking functions from suspending functions

DevFeed: [Calling blocking functions from suspending functions](<https://devfeed.tech/articles/calling-blocking-functions-from-suspending-functions-39321.md>)

Original publisher: [Read original article](<https://kt.academy/article/interop-blocking-to-coroutines>)

Published: 2025-07-21T00:00:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [interoperability](<https://devfeed.tech/topics/interoperability.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>)

Tags: [blocking](<https://devfeed.tech/tags/blocking.md>), [guide](<https://devfeed.tech/tags/guide.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [interoperability](<https://devfeed.tech/tags/interoperability.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

A guide to using blocking library functions with Kotlin Coroutines by converting them into suspending functions or flows. It explains how blocking operations affect the current thread and how to identify whether a function is blocking.

### Source excerpt

A guide on how to correctly convert blocking functions into suspending functions in Kotlin Coroutines.

## Why Switch to Firefox: Open Source, Ad Blocking, and Android Extensions

DevFeed: [Why Switch to Firefox: Open Source, Ad Blocking, and Android Extensions](<https://devfeed.tech/articles/how-to-firefox-25260.md>)

Original publisher: [Read original article](<https://kau.sh/blog/how-to-firefox/>)

Author: Kaushik Gopal

Published: 2025-07-18T00:00:00Z

Content type: opinion

Language: en

Sources: [Kaushik Gopal's Site](<https://devfeed.tech/sources/kaushik-gopal-s-site.md>)

Topics: [Firefox](<https://devfeed.tech/topics/firefox.md>), [uBlock Origin Filters](<https://devfeed.tech/topics/ublock-origin-filters.md>), [Chrome](<https://devfeed.tech/topics/chrome.md>), [firefox for android](<https://devfeed.tech/topics/firefox-for-android.md>), [Firefox extension](<https://devfeed.tech/topics/firefox-extension.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [ads](<https://devfeed.tech/tags/ads.md>), [android](<https://devfeed.tech/tags/android.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [chrome](<https://devfeed.tech/tags/chrome.md>), [extensions](<https://devfeed.tech/tags/extensions.md>), [firefox](<https://devfeed.tech/tags/firefox.md>), [open-source](<https://devfeed.tech/tags/open-source.md>)

### AI overview

An opinionated guide encouraging readers to switch to Firefox, citing its open-source code, support for uBlock Origin, synchronization on Android, and mobile browser extensions.

### Source excerpt

Chrome finally pulled the trigger on the web's best ad-blocker, uBlock Origin. Now that Chrome has hobbled uBO, Firefox -- my beloved --1 is surging again. I want to do my part to convince you to switch to Firefox and show you how I use it. Why Firefox # Let's get through the important talking points, in case you need a quick copy paste to convince a friend. 100% open-source Un-enshittify the web Android users rejoice Customize to your heart's content 100% open-source ## This section can be quick. Here's a github link to the source code of the Firefox browser. You can clone the repo, pop open your favorite AI code assistant and start asking questions about your browser - the most important app you use. What libraries does their Android app use? libs.versions.toml boom! Also 8.11.1 on android gradle plugin? not bad Firefox. Their license allows you to fork and distribute alternative versions. Vibe code a whole new browser. Un-enshittify the web ## Most of the web today is enshittified with a cesspool of ads, popups, cookie notices, and tracking scripts. Our primary defense has been ad-blockers, with the most powerful being uBlock Origin. uBO relies on community-curated filter lists that play a cat-and-mouse game to zap known ads, trackers, and other digital sludge. But with Chrome controlling the web, Google followed through on its promise to kneecap uBO with Manifest V3, effectively blocking the full version from its extension store. Sure, there's uBlock Origin "Lite" now, which does the same thing, right? Nope: uBlock Origin Lite != uBlock Origin Filter lists update only when the extension updates no fetching up to date lists from servers (this is a big one!) No custom filters so no element picker which allows you to point and zap Many filters are dropped at conversion time due to MV3's limited filter syntax No strict-blocked pages No per-site switches No dynamic filtering No importing external lists Did you know, uBlock Origin works best on Firefox. Why not just use

## Converting Future to CompletableFuture With Java Virtual Threads

DevFeed: [Converting Future to CompletableFuture With Java Virtual Threads](<https://devfeed.tech/articles/converting-future-to-completablefuture-with-java-virtual-threads-18821.md>)

Original publisher: [Read original article](<https://www.morling.dev/blog/future-to-completablefuture-with-java-virtual-threads/>)

Published: 2025-07-17T08:25:00Z

Content type: tutorial

Language: en

Sources: [Gunnar Morling](<https://devfeed.tech/sources/gunnar-morling.md>)

Topics: [Java](<https://devfeed.tech/topics/java.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [asynchronous](<https://devfeed.tech/tags/asynchronous.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [java](<https://devfeed.tech/tags/java.md>), [java-8](<https://devfeed.tech/tags/java-8.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

This tutorial explains how Java 21+ virtual threads can help convert legacy Future objects into CompletableFuture instances. It contrasts blocking, polling, and asynchronous approaches, noting that virtual threads make blocking inexpensive by unmounting blocked threads from their underlying platform threads.

### Source excerpt

This post explores how virtual threads in Java 21+ provide an elegant solution for converting legacy Future objects into CompletableFuture instances. Since Java 8, the CompletableFuture API provides a convenient way for performing asynchronous operations in a functional, composable way. This makes it very simple to call some long-running methods--for instance involving external I/O--asynchronously and process each result as soon as it is available, without blocking on any threads:

## Parallelism with Android SQLite

DevFeed: [Parallelism with Android SQLite](<https://devfeed.tech/articles/parallelism-with-android-sqlite-25628.md>)

Original publisher: [Read original article](<https://blog.p-y.wtf/parallelism-with-android-sqlite>)

Author: Pierre-Yves Ricau

Published: 2025-02-05T05:35:36Z

Content type: tutorial

Language: en

Sources: [Py's blog](<https://devfeed.tech/sources/py-s-blog.md>)

Topics: [SQLite](<https://devfeed.tech/topics/sqlite.md>), [Android](<https://devfeed.tech/topics/android.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [IO](<https://devfeed.tech/topics/io.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [connection-pool](<https://devfeed.tech/tags/connection-pool.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [io](<https://devfeed.tech/tags/io.md>), [parallelism](<https://devfeed.tech/tags/parallelism.md>), [performance](<https://devfeed.tech/tags/performance.md>), [sqlite](<https://devfeed.tech/tags/sqlite.md>)

### AI overview

This article explains how Android SQLite's default single-connection behavior causes parallel queries on the same database to block one another. It examines how excessive query parallelism can consume coroutine dispatcher threads and delay unrelated I/O tasks, then discusses using separate dispatchers for blocking database work.

### Source excerpt

The SQLDelight documentation provides this example: val players: Flow> = playerQueries.selectAll() .asFlow() .mapToList(Dispatchers.IO) This looks reasonable, right? In the Square Point Of Sale application, we recently ...

## Why Kotlin Coroutines simplify asynchronous, non-blocking development

DevFeed: [Why Kotlin Coroutines simplify asynchronous, non-blocking development](<https://devfeed.tech/articles/why-using-kotlin-coroutines-39247.md>)

Original publisher: [Read original article](<https://kt.academy/article/cc-why>)

Published: 2024-10-09T00:03:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [Android](<https://devfeed.tech/topics/android.md>), [RxJava](<https://devfeed.tech/topics/rxjava.md>)

Tags: [asynchronous](<https://devfeed.tech/tags/asynchronous.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [reactive-streams](<https://devfeed.tech/tags/reactive-streams.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

This tutorial chapter explains why Kotlin Coroutines are useful for asynchronous programming. It highlights their multiplatform support, lightweight execution, non-blocking imperative and reactive styles, reduced boilerplate, and simpler debugging and maintenance compared with callbacks and reactive streams.

### Source excerpt

The explanation of why coroutines stand out and offer us what hasn't been offered by other technologies.

## Kotlin Coroutines dispatchers

DevFeed: [Kotlin Coroutines dispatchers](<https://devfeed.tech/articles/kotlin-coroutines-dispatchers-39236.md>)

Original publisher: [Read original article](<https://kt.academy/article/cc-dispatchers>)

Published: 2024-07-01T00:00:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Library](<https://devfeed.tech/topics/library.md>), [RxJava](<https://devfeed.tech/topics/rxjava.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [blocking](<https://devfeed.tech/tags/blocking.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [dispatcher](<https://devfeed.tech/tags/dispatcher.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [main-thread](<https://devfeed.tech/tags/main-thread.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [ui](<https://devfeed.tech/tags/ui.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

This tutorial explains Kotlin Coroutines dispatchers, which determine the thread or thread pool where coroutines start and resume. It covers the default dispatcher, limiting dispatcher parallelism, and the Main dispatcher for UI-related work, with a comparison to RxJava schedulers.

### Source excerpt

Where we should use each dispatcher from the Kotlin Coroutines library.

## Use Github with SSH on port 443

DevFeed: [Use Github with SSH on port 443](<https://devfeed.tech/articles/use-github-with-ssh-on-port-443-27684.md>)

Original publisher: [Read original article](<https://gagor.pro/2023/12/use-github-with-ssh-on-port-443/>)

Author: Tom

Published: 2023-12-26T00:00:00Z

Content type: tutorial

Language: en

Sources: [Tomasz Gągor](<https://devfeed.tech/sources/tomasz-gagor.md>)

Topics: [GitHub](<https://devfeed.tech/topics/github.md>), [OpenSSH](<https://devfeed.tech/topics/openssh.md>), [Firewall](<https://devfeed.tech/topics/firewall.md>)

Tags: [blocking](<https://devfeed.tech/tags/blocking.md>), [bypass-firewall-github](<https://devfeed.tech/tags/bypass-firewall-github.md>), [firewall](<https://devfeed.tech/tags/firewall.md>), [github](<https://devfeed.tech/tags/github.md>), [github-repository-access](<https://devfeed.tech/tags/github-repository-access.md>), [github-ssh-port-443](<https://devfeed.tech/tags/github-ssh-port-443.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [https](<https://devfeed.tech/tags/https.md>), [linux](<https://devfeed.tech/tags/linux.md>), [port](<https://devfeed.tech/tags/port.md>), [repository](<https://devfeed.tech/tags/repository.md>), [ssh](<https://devfeed.tech/tags/ssh.md>), [ssh-configuration-github](<https://devfeed.tech/tags/ssh-configuration-github.md>), [ssh-github-access](<https://devfeed.tech/tags/ssh-github-access.md>), [timeout](<https://devfeed.tech/tags/timeout.md>), [wifi](<https://devfeed.tech/tags/wifi.md>)

### AI overview

This tutorial explains how to use GitHub over SSH on port 443 when standard SSH access is blocked or times out, such as on hotel or public Wi-Fi networks. It describes configuring the connection to simulate HTTPS traffic so repositories can still be cloned, pulled, and pushed over SSH.

### Source excerpt

Learn how to use GitHub with SSH on port 443 to bypass firewall restrictions and ensure seamless repository access.

## Keycloak 23.0.2 released

DevFeed: [Keycloak 23.0.2 released](<https://devfeed.tech/articles/keycloak-23-0-2-released-31627.md>)

Original publisher: [Read original article](<https://www.keycloak.org/2023/12/keycloak-2302-released>)

Author: Keycloak Team

Published: 2023-12-14T00:00:00Z

Content type: release

Language: en

Sources: [Keycloak Blog](<https://devfeed.tech/sources/keycloak-blog.md>)

Topics: [Keycloak](<https://devfeed.tech/topics/keycloak.md>), [health check](<https://devfeed.tech/topics/health-check.md>), [Availability](<https://devfeed.tech/topics/availability.md>), [bug](<https://devfeed.tech/topics/bug.md>), [Deployment](<https://devfeed.tech/topics/deployment.md>), [upgrade](<https://devfeed.tech/topics/upgrade.md>), [OpenID connect (OIDC)](<https://devfeed.tech/topics/oidc.md>), [saml](<https://devfeed.tech/topics/saml.md>)

Tags: [availability](<https://devfeed.tech/tags/availability.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [bug](<https://devfeed.tech/tags/bug.md>), [deployment](<https://devfeed.tech/tags/deployment.md>), [encryption](<https://devfeed.tech/tags/encryption.md>), [health-check](<https://devfeed.tech/tags/health-check.md>), [idm](<https://devfeed.tech/tags/idm.md>), [kerberos](<https://devfeed.tech/tags/kerberos.md>), [keycloak](<https://devfeed.tech/tags/keycloak.md>), [keycloak-release](<https://devfeed.tech/tags/keycloak-release.md>), [ldap](<https://devfeed.tech/tags/ldap.md>), [oidc](<https://devfeed.tech/tags/oidc.md>), [openid-connect](<https://devfeed.tech/tags/openid-connect.md>), [release](<https://devfeed.tech/tags/release.md>), [saml](<https://devfeed.tech/tags/saml.md>), [sso](<https://devfeed.tech/tags/sso.md>), [upgrade](<https://devfeed.tech/tags/upgrade.md>)

### AI overview

Keycloak 23.0.2 is released with a non-blocking /lb-check health endpoint for load balancers. The release also includes an Infinispan upgrade, migration guidance, and fixes for SAML, OIDC, database configuration, administration UI, documentation, account UI, user profiles, and the operator.

### Source excerpt

To download the release go to Keycloak downloads. Highlights Non-blocking health check for load balancers A new health check endpoint available at /lb-check was added. The execution is running in the event loop which means this check is responsive also in overloaded situations when Keycloak needs to handle many requests waiting in request queue. This behavior is useful, for example, in multi-site deployment where we do not want to fail over to the other site under heavy load. The endpoint is currently checking availability of the embedded and external Infinispan caches. Other checks may be added later. This endpoint is not available by default. To enable it, run Keycloak with feature multi-site. Proceed to Enabling and disabling features guide for more details. Upgrading Before upgrading refer to the migration guide for a complete list of changes. All resolved issues Enhancements #25113 Add a test for the LoadBalancerCheck #25287 Upgrade Infinispan to 14.0.21.Final Bugs #24652 SAML decryption fails if keycloak.saml.deprecated.encryption flag is set saml #24986 `getMultiPartFormParameters()` always returns `EmptyMultivaluedMap` after upgrade to Resteasy Reactive core #25001 Client redirect_uri check must be compared using exact string matching oidc #25010 Bug: KC_DB_USERNAME environment variable is causing a crash in latest version dist/quarkus #25051 Unexpected Application Error when clicking "Cancel" on user creation page admin/ui #25108 Documentation Inconsistency about Open Banking(Finance) Brasil FAPI security profile docs #25124 If a client does not have a URL the applications page in the account console links to about:blank account/ui #25173 Make sure username is lowercase when normalizing attributes user-profile #25183 NullPointerException thrown for UPConfig.getGroups() user-profile #25307 Keycloak instance `HasErrors` true after update: `More than 1 secondary resource related to primary` operator

## Improving product reliability by imposing constraints as a part of CI/CD process

DevFeed: [Improving product reliability by imposing constraints as a part of CI/CD process](<https://devfeed.tech/articles/improving-product-reliability-by-imposing-constraints-as-a-part-of-ci-cd-process-26344.md>)

Original publisher: [Read original article](<https://medium.com/revolut/improving-product-reliability-by-imposing-constraints-as-a-part-of-ci-cd-process-597cf2307224?source=rss----44c5ac415e14---4>)

Author: Pedro Moura

Published: 2023-11-03T14:26:59Z

Content type: article

Language: en

Sources: [Revolut Engineering](<https://devfeed.tech/sources/revolut-engineering.md>)

Topics: [CI/CD](<https://devfeed.tech/topics/cicd.md>), [Application Security](<https://devfeed.tech/topics/application-security.md>), [Vulnerabilities](<https://devfeed.tech/topics/vulnerabilities.md>), [Data analysis](<https://devfeed.tech/topics/data-analysis.md>)

Tags: [application-security](<https://devfeed.tech/tags/application-security.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [ci-cd](<https://devfeed.tech/tags/ci-cd.md>), [data-analysis](<https://devfeed.tech/tags/data-analysis.md>), [devsecops](<https://devfeed.tech/tags/devsecops.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [sast](<https://devfeed.tech/tags/sast.md>), [sca](<https://devfeed.tech/tags/sca.md>), [scanners](<https://devfeed.tech/tags/scanners.md>), [security](<https://devfeed.tech/tags/security.md>), [security-vulnerabilities](<https://devfeed.tech/tags/security-vulnerabilities.md>), [software-development](<https://devfeed.tech/tags/software-development.md>)

### AI overview

Revolut describes a CI/CD approach that uses automated risk calculation, data analysis, security scanning, and deployment constraints to improve product reliability. The approach aims to identify vulnerabilities and bugs early, mitigate them, and potentially block high-risk applications from reaching production.

### Source excerpt

At Revolut, we always aim to consistently provide efficient, high-quality, and secure services. Our primary goals are to enhance product quality, increase customer satisfaction, and reduce business risk. To achieve those goals, we should aim to be as proactive -- rather than reactive -- as possible. This means fixing any point of failure before it reaches production by identifying, reporting, and potentially blocking deployments that can impact the reliability of our products. In this article, we'll explain how we achieve those goals using automated risk calculation, data analysis, and imposing constraints to push for the mitigation of open vulnerabilities and the fix of reported bugs identified in our products. Challenges faced by Revolut Each application/service has its own specifications, with different technology stacks and architectures, bringing a diversity of security challenges and different vulnerabilities. That being said, application risk cannot be based only on the reported security vulnerabilities but also in the context of that specific application. Continuous scanning, reporting, visibility, and risk evaluation are essential to providing the best security advice and automated security controls. Nowadays there are several types of security scanners (SAST, SCA, DAST, IaC, etc.) that help security professionals to identify and report vulnerabilities, where each of them can belong to a different third-party provider. For further information on these, read our article on continuous security. Data scraped from different sources creates friction when it's needed to group findings and provide mitigations. This can also decrease mean time to identify vulnerabilities and mean time to provide mitigations. Also, to avoid such negative workflow impact, security must be shifted left. Without a centralised source of truth for security-related application data, most of the time is wasted on searching for information/findings in segmented platforms and finding the corre

## Sleepless Concurrency: delay() vs. Thread.sleep()

DevFeed: [Sleepless Concurrency: delay() vs. Thread.sleep()](<https://devfeed.tech/articles/sleepless-concurrency-delay-vs-thread-sleep-25750.md>)

Original publisher: [Read original article](<https://blog.shreyaspatil.dev/sleepless-concurrency-delay-vs-threadsleep/>)

Author: Shreyas Patil

Published: 2023-07-31T04:39:30Z

Content type: tutorial

Language: en

Sources: [Shreyas Patil's Blog](<https://devfeed.tech/sources/shreyas-patil-s-blog.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Programming](<https://devfeed.tech/topics/programming.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [asynchronous](<https://devfeed.tech/tags/asynchronous.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [java](<https://devfeed.tech/tags/java.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [main-thread](<https://devfeed.tech/tags/main-thread.md>), [multithreading](<https://devfeed.tech/tags/multithreading.md>), [threading](<https://devfeed.tech/tags/threading.md>)

### AI overview

This tutorial explains how Kotlin coroutines implement delay() on the JVM and contrasts its non-blocking behavior with Java's blocking Thread.sleep(). A single-thread example shows that delay() allows concurrent coroutines to progress, while Thread.sleep() makes the second coroutine wait and roughly doubles total execution time.

### Source excerpt

Explore the difference between delay() and Thread.sleep() in Kotlin. Understand how non-blocking concurrency works from a platform perspective.

## How much does the read/write buffer size matter for socket throughput?

DevFeed: [How much does the read/write buffer size matter for socket throughput?](<https://devfeed.tech/articles/how-much-does-the-read-write-buffer-size-matter-for-socket-throughput-20758.md>)

Original publisher: [Read original article](<https://www.evanjones.ca/read-write-buffer-size.html>)

Published: 2023-07-16T16:04:32Z

Content type: article

Language: en

Sources: [Evan Jones](<https://devfeed.tech/sources/evan-jones.md>)

Topics: [IO](<https://devfeed.tech/topics/io.md>), [systems](<https://devfeed.tech/topics/systems.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [Benchmark](<https://devfeed.tech/topics/benchmark.md>), [networking](<https://devfeed.tech/topics/networking.md>), [Rust](<https://devfeed.tech/topics/rust.md>), [Ubuntu](<https://devfeed.tech/topics/ubuntu.md>), [Google Cloud Platform (GCP)](<https://devfeed.tech/topics/google-cloud.md>)

Tags: [amd](<https://devfeed.tech/tags/amd.md>), [benchmark](<https://devfeed.tech/tags/benchmark.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [cloud](<https://devfeed.tech/tags/cloud.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [kernel](<https://devfeed.tech/tags/kernel.md>), [linux](<https://devfeed.tech/tags/linux.md>), [networking](<https://devfeed.tech/tags/networking.md>), [performance](<https://devfeed.tech/tags/performance.md>), [processors](<https://devfeed.tech/tags/processors.md>), [rust](<https://devfeed.tech/tags/rust.md>), [tcp](<https://devfeed.tech/tags/tcp.md>), [test](<https://devfeed.tech/tags/test.md>), [ubuntu](<https://devfeed.tech/tags/ubuntu.md>), [unix](<https://devfeed.tech/tags/unix.md>)

### AI overview

This article reports experiments on how blocking I/O buffer sizes affect read() and write() throughput. It finds that approximately 32 KiB is a useful starting point, while large writes may benefit from buffers around 256 KiB to 1 MiB. Results vary by hardware and software.

### Source excerpt

The read() and write() system calls take a variable-length byte array as an argument. As a simplified model, the time for the system call should be some constant "per-call" time, plus time directly proportional to the number of bytes in the array. That is, the time for each call should be time = (per_call_minimum_time) + (array_len) x (per_byte_time). With this model, using a larger buffer should increase throughput, asymptotically approaching 1/per_byte_time. I was curious: do real system calls behave this way? What are the ideal buffer sizes for read() and write() if we want to maximize throughput? I decided to do some experiments with blocking I/O. These are not rigorous, and I suspect the results will vary significantly if the hardware and software are different than one the system I tested. The really short answer is that a buffer of 32 KiB is a good starting point on today's systems, and I would want to measure the performance to go beyond that. However, for large writes, performance can increase. On Linux, the simple model holds for small buffers (≤ 4 KiB), but once the program approaches the maximum throughput, the throughput becomes highly variable and in many cases decreases as the buffers get larger. For blocking I/O, approximately 32 KiB is large enough to hit the maximum throughput for read(), but write() throughput improves with buffers up to around 256 KiB - 1 MiB. The reason for the asymmetry is that the Linux kernel will only write less than the entire buffer (a "short write") if there is an error (e.g. a signal causing EINTR). Thus, larger write buffers means the operating system needs to switch to the process less often. On the other head, "short reads", where a read() returns less than the maximum length, become increasingly common as the buffer size increases, which diminishes the benefit. There is a SO_RCVLOWAT socket option to change this that I did not test. The experiments were run on two 16 CPU Google Cloud T2D instances, which use AMD EPYC

## Running Kotlin coroutines on Project Loom's virtual threads

DevFeed: [Running Kotlin coroutines on Project Loom's virtual threads](<https://devfeed.tech/articles/running-kotlin-coroutines-on-project-loom-s-virtual-threads-39265.md>)

Original publisher: [Read original article](<https://kt.academy/article/dispatcher-loom>)

Published: 2023-01-09T00:00:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Java](<https://devfeed.tech/topics/java.md>)

Tags: [asynchronous](<https://devfeed.tech/tags/asynchronous.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [parallelism](<https://devfeed.tech/tags/parallelism.md>), [project-loom](<https://devfeed.tech/tags/project-loom.md>), [threads](<https://devfeed.tech/tags/threads.md>), [virtual](<https://devfeed.tech/tags/virtual.md>), [vm](<https://devfeed.tech/tags/vm.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

A tutorial shows how to run Kotlin coroutines on Project Loom virtual threads by creating a custom dispatcher from an ExecutorService. It compares the expected and observed execution time of large numbers of blocking calls using standard coroutine dispatchers and a Loom-based dispatcher.

### Source excerpt

How to use Project Loom to improve Coroutines performance.

## Identifying Blocked Producers in Java BlockingQueue with Profiling and JDK Flight Recorder

DevFeed: [Identifying Blocked Producers in Java BlockingQueue with Profiling and JDK Flight Recorder](<https://devfeed.tech/articles/is-your-blocking-queue-blocking-18839.md>)

Original publisher: [Read original article](<https://www.morling.dev/blog/is-your-blocking-queue-blocking/>)

Published: 2023-01-03T21:10:00Z

Content type: tutorial

Language: en

Sources: [Gunnar Morling](<https://devfeed.tech/sources/gunnar-morling.md>)

Topics: [Java](<https://devfeed.tech/topics/java.md>), [JDK Flight Recorder](<https://devfeed.tech/topics/jdk-flight-recorder.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>)

Tags: [blocking](<https://devfeed.tech/tags/blocking.md>), [java](<https://devfeed.tech/tags/java.md>), [jdk-flight-recorder](<https://devfeed.tech/tags/jdk-flight-recorder.md>), [performance](<https://devfeed.tech/tags/performance.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

This tutorial explains how to detect producer threads blocked while adding work to a bounded Java BlockingQueue. It discusses wall-clock profiling with async-profiler and using custom JDK Flight Recorder events when profiling is unavailable.

### Source excerpt

Table of Contents Emitting Custom Events Filtering "Thread Park" Events Towards Real-Time Analysis of JFR Events Java's BlockingQueue hierarchy is widely used for coordinating work between different producer and consumer threads. When set up with a maximum capacity (i.e. a bounded queue), no more elements can be added by producers to the queue once it is full, until a consumer has taken at least one element. For scenarios where new work may arrive more quickly than it can be consumed, this applies means of back-pressure, ensuring the application doesn't run out of memory eventually, while enqueuing more and more work items.

## Kotlin Coroutines use cases for Data/Adapters Layer

DevFeed: [Kotlin Coroutines use cases for Data/Adapters Layer](<https://devfeed.tech/articles/kotlin-coroutines-use-cases-for-data-adapters-layer-39243.md>)

Original publisher: [Read original article](<https://kt.academy/article/cc-use-cases-data-layer>)

Published: 2022-11-15T00:00:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [callback](<https://devfeed.tech/topics/callback.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Databases](<https://devfeed.tech/topics/databases.md>), [SQLite](<https://devfeed.tech/topics/sqlite.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [blocking](<https://devfeed.tech/tags/blocking.md>), [callback](<https://devfeed.tech/tags/callback.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [databases](<https://devfeed.tech/tags/databases.md>), [functions](<https://devfeed.tech/tags/functions.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [sqlite](<https://devfeed.tech/tags/sqlite.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

This tutorial explains common Kotlin Coroutines use cases in the Data/Adapters Layer, including repository and provider implementations, adapting callback-based APIs into suspending functions, and handling blocking calls with an appropriate dispatcher.

### Source excerpt

How do we use Kotlin Coroutines in the Data/Adapters Layer, how do we use callback or blocking functions.

## How does suspension work in Kotlin coroutines?

DevFeed: [How does suspension work in Kotlin coroutines?](<https://devfeed.tech/articles/how-does-suspension-work-in-kotlin-coroutines-39239.md>)

Original publisher: [Read original article](<https://kt.academy/article/cc-suspension>)

Published: 2021-07-28T00:00:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>)

Tags: [backend](<https://devfeed.tech/tags/backend.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [concurrently](<https://devfeed.tech/tags/concurrently.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [suspend](<https://devfeed.tech/tags/suspend.md>), [thread](<https://devfeed.tech/tags/thread.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

This tutorial explains how suspension works in Kotlin coroutines. It contrasts coroutine suspension with thread blocking, describes how suspended coroutines retain their state while using fewer resources, and introduces suspending functions and their role in suspending coroutines.

### Source excerpt

A deep explanation of how suspension works in Kotlin Coroutines.

[Next page](<https://devfeed.tech/tags/blocking.md?cursor=WyIyMDIxLTA3LTI4VDAwOjAwOjAwKzAwOjAwIiwgImRhNDc0YTAxLTY1MGItNGJkOS05OTZmLWYzZjdjNDU3NjI4NSJd>)