| Skip to content | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#start-of-content |
|
| https://patch-diff.githubusercontent.com/ |
|
Sign in
| https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2Farnk14%2Fjava-concurrency |
| GitHub CopilotWrite better code with AI | https://github.com/features/copilot |
| GitHub SparkBuild and deploy intelligent apps | https://github.com/features/spark |
| GitHub ModelsManage and compare prompts | https://github.com/features/models |
| MCP RegistryNewIntegrate external tools | https://github.com/mcp |
| ActionsAutomate any workflow | https://github.com/features/actions |
| CodespacesInstant dev environments | https://github.com/features/codespaces |
| IssuesPlan and track work | https://github.com/features/issues |
| Code ReviewManage code changes | https://github.com/features/code-review |
| GitHub Advanced SecurityFind and fix vulnerabilities | https://github.com/security/advanced-security |
| Code securitySecure your code as you build | https://github.com/security/advanced-security/code-security |
| Secret protectionStop leaks before they start | https://github.com/security/advanced-security/secret-protection |
| Why GitHub | https://github.com/why-github |
| Documentation | https://docs.github.com |
| Blog | https://github.blog |
| Changelog | https://github.blog/changelog |
| Marketplace | https://github.com/marketplace |
| View all features | https://github.com/features |
| Enterprises | https://github.com/enterprise |
| Small and medium teams | https://github.com/team |
| Startups | https://github.com/enterprise/startups |
| Nonprofits | https://github.com/solutions/industry/nonprofits |
| App Modernization | https://github.com/solutions/use-case/app-modernization |
| DevSecOps | https://github.com/solutions/use-case/devsecops |
| DevOps | https://github.com/solutions/use-case/devops |
| CI/CD | https://github.com/solutions/use-case/ci-cd |
| View all use cases | https://github.com/solutions/use-case |
| Healthcare | https://github.com/solutions/industry/healthcare |
| Financial services | https://github.com/solutions/industry/financial-services |
| Manufacturing | https://github.com/solutions/industry/manufacturing |
| Government | https://github.com/solutions/industry/government |
| View all industries | https://github.com/solutions/industry |
| View all solutions | https://github.com/solutions |
| AI | https://github.com/resources/articles?topic=ai |
| Software Development | https://github.com/resources/articles?topic=software-development |
| DevOps | https://github.com/resources/articles?topic=devops |
| Security | https://github.com/resources/articles?topic=security |
| View all topics | https://github.com/resources/articles |
| Customer stories | https://github.com/customer-stories |
| Events & webinars | https://github.com/resources/events |
| Ebooks & reports | https://github.com/resources/whitepapers |
| Business insights | https://github.com/solutions/executive-insights |
| GitHub Skills | https://skills.github.com |
| Documentation | https://docs.github.com |
| Customer support | https://support.github.com |
| Community forum | https://github.com/orgs/community/discussions |
| Trust center | https://github.com/trust-center |
| Partners | https://github.com/partners |
| GitHub SponsorsFund open source developers | https://github.com/sponsors |
| Security Lab | https://securitylab.github.com |
| Maintainer Community | https://maintainers.github.com |
| Accelerator | https://github.com/accelerator |
| Archive Program | https://archiveprogram.github.com |
| Topics | https://github.com/topics |
| Trending | https://github.com/trending |
| Collections | https://github.com/collections |
| Enterprise platformAI-powered developer platform | https://github.com/enterprise |
| GitHub Advanced SecurityEnterprise-grade security features | https://github.com/security/advanced-security |
| Copilot for BusinessEnterprise-grade AI features | https://github.com/features/copilot/copilot-business |
| Premium SupportEnterprise-grade 24/7 support | https://github.com/premium-support |
| Pricing | https://github.com/pricing |
| Search syntax tips | https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax |
| documentation | https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax |
|
Sign in
| https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2Farnk14%2Fjava-concurrency |
|
Sign up
| https://patch-diff.githubusercontent.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&source=header-repo&source_repo=arnk14%2Fjava-concurrency |
| Reload | https://patch-diff.githubusercontent.com/arnk14/java-concurrency |
| Reload | https://patch-diff.githubusercontent.com/arnk14/java-concurrency |
| Reload | https://patch-diff.githubusercontent.com/arnk14/java-concurrency |
|
arnk14
| https://patch-diff.githubusercontent.com/arnk14 |
| java-concurrency | https://patch-diff.githubusercontent.com/arnk14/java-concurrency |
| code-review-checklists/java-concurrency | https://patch-diff.githubusercontent.com/code-review-checklists/java-concurrency |
|
Notifications
| https://patch-diff.githubusercontent.com/login?return_to=%2Farnk14%2Fjava-concurrency |
|
Fork
0
| https://patch-diff.githubusercontent.com/login?return_to=%2Farnk14%2Fjava-concurrency |
|
Star
0
| https://patch-diff.githubusercontent.com/login?return_to=%2Farnk14%2Fjava-concurrency |
|
0
stars
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/stargazers |
|
155
forks
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/forks |
|
Branches
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/branches |
|
Tags
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/tags |
|
Activity
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/activity |
|
Star
| https://patch-diff.githubusercontent.com/login?return_to=%2Farnk14%2Fjava-concurrency |
|
Notifications
| https://patch-diff.githubusercontent.com/login?return_to=%2Farnk14%2Fjava-concurrency |
|
Code
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency |
|
Pull requests
0
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/pulls |
|
Actions
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/actions |
|
Projects
0
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/projects |
|
Security
0
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/security |
|
Insights
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/pulse |
|
Code
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency |
|
Pull requests
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/pulls |
|
Actions
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/actions |
|
Projects
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/projects |
|
Security
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/security |
|
Insights
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/pulse |
| Branches | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/branches |
| Tags | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/tags |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/branches |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/tags |
| 84 Commits | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/commits/master/ |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency/commits/master/ |
| README.md | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/blob/master/README.md |
| README.md | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/blob/master/README.md |
| _config.yml | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/blob/master/_config.yml |
| _config.yml | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/blob/master/_config.yml |
| README | https://patch-diff.githubusercontent.com/arnk14/java-concurrency |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#code-review-checklist-java-concurrency |
| Concurrency is rationalized? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#rationalize |
| Can use patterns to simplify concurrency? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-patterns |
| Usage of synchronized with wait/notify instead of concurrency utilities
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#avoid-wait-notify |
| Nested critical sections | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#avoid-nested-critical-sections |
| Extension API call within a critical section | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-open-call |
| Large critical section | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#minimize-critical-sections |
| Waiting in a loop for some result | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-busy-wait |
| Non-static ThreadLocal | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threadlocal-design |
| Thread.sleep() | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#no-sleep-schedule |
| Thread safety is justified in comments? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-document |
| Class (method, field) has concurrent access documentation? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-document |
| Threading model of a subsystem (class) is described? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threading-flow-model |
| Concurrent control flow (or data flow) of a subsystem (class) is described?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threading-flow-model |
| Class is documented as immutable, thread-safe, or not thread-safe? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#immutable-thread-safe |
| Used concurrency patterns are pronounced? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#name-patterns |
| ConcurrentHashMap is not stored in a variable of Map type? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-map-type |
| compute()-like methods are not called on a variable of ConcurrentMap type? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#chm-type |
| @GuardedBy annotation is used? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guarded-by |
| Safety of a benign race (e. g. unbalanced synchronization) is explained? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#document-benign-race |
| Each use of volatile is justified? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-volatile |
| Each field that is neither volatile nor annotated with @GuardedBy has a comment?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#plain-field |
| Static methods and fields are thread-safe? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#static-thread-safe |
| Thread doesn't wait in a loop for a non-volatile field to be updated by another thread?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-visibility |
| Read access to a non-volatile, concurrently updatable primitive field is protected?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-protection |
| Servlets, Controllers, Filters, Handlers, @Get/@Post methods are thread-safe?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#server-framework-sync |
| Calls to DateFormat.parse() and format() are synchronized? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#dateformat |
| No "extra" (pseudo) thread safety? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#pseudo-safety |
| No atomics on which only get() and set() are called? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#redundant-atomics |
| Class (method) needs to be thread-safe? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-thread-safety |
| ReentrantLock (ReentrantReadWriteLock, Semaphore) needs to be fair? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-fairness |
| No put() or remove() calls on a ConcurrentMap (or Cache) after get() or
containsKey()? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#chm-race |
| No point accesses to a non-thread-safe collection outside of critical sections?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-point-read |
| Iteration over a non-thread-safe collection doesn't leak outside of a critical section?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-iteration |
| A non-thread-safe collection is not returned wrapped in Collections.unmodifiable*() from
a getter in a thread-safe class? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-iteration |
| A synchronized collection is not returned from a getter? in a thread-safe class?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-iteration |
| Non-trivial mutable object is not returned from a getter in a thread-safe class?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-mutation-race |
| No separate getters to an atomically updated state? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#moving-state-race |
| No check-then-act race conditions (state used inside a critical section is read outside of
it)? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#read-outside-critical-section-race |
| coll.toArray(new E[coll.size()]) is not called on a synchronized collection?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#read-outside-critical-section-race |
| No race conditions with user or programmatic input or interop between programs?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#outside-world-race |
| No check-then-act race conditions with file system operations? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#outside-world-race |
| No concurrent invalidate(key) and get() calls on Guava's loading Cache?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guava-cache-invalidation-race |
| Cache.put() is not used (nor exposed in the own Cache interface)? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cache-invalidation-race |
| Concurrent invalidation race is not possible on a lazily initialized state?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cache-invalidation-race |
| Iteration, Stream pipeline, or copying a Collections.synchronized*() collection is protected
by the lock? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#synchronized-collection-iter |
| A synchronized collection is passed into containsAll(), addAll(), removeAll(), or
putAll() under the lock? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#synchronized-collection-iter |
| Considered adding multi-threaded unit tests for a thread-safe class or method?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#multi-threaded-tests |
| What is the worst thing that might happen if the code has a concurrency bug?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#multi-threaded-tests |
| A shared Random instance is not used from concurrent test workers? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-test-random |
| Concurrent test workers coordinate their start? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#coordinate-test-workers |
| There are more test threads than CPUs (if possible for the test)? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#test-workers-interleavings |
| Assertions in parallel threads and asynchronous code are handled properly? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-assert |
| Checked the result of CountDownLatch.await()? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#check-await |
| Can use some concurrency utility instead of a lock with conditional wait (await) calls?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#avoid-wait-notify |
| Can use Guava’s Monitor instead of a lock with conditional wait (await) calls?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guava-monitor |
| Can use synchronized instead of a ReentrantLock? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-synchronized |
| lock() is called outside of try {}? No statements between lock() and try {}?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lock-unlock |
| Can avoid nested critical sections? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#avoid-nested-critical-sections |
| Locking order for nested critical sections is documented? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#document-locking-order |
| Dynamically determined locks for nested critical sections are ordered? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#dynamic-lock-ordering |
| No extension API calls within critical sections? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-open-call |
| No calls to ConcurrentHashMap's methods (incl. get()) in compute()-like lambdas on the
same map? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#chm-nested-calls |
| Critical section is as small as possible? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#minimize-critical-sections |
| Can use ConcurrentHashMap.compute() or Guava's Striped for per-key locking?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#increase-locking-granularity |
| Can replace a blocking collection or a queue with a concurrent one? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-collections |
| Can use ClassValue instead of ConcurrentHashMap? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-class-value |
| Considered ReadWriteLock (or StampedLock) instead of a simple lock? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#read-write-lock |
| StampedLock is used instead of ReadWriteLock when reentrancy is not needed?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-stamped-lock |
| Considered LongAdder instead of an AtomicLong for a "hot field"?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#long-adder-for-hot-fields |
| Considered queues from JCTools instead of the standard concurrent queues? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#jctools |
| Considered Caffeine cache instead of other caching libraries? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#caffeine |
| Can apply speculation (optimistic concurrency) technique? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#speculation |
| Considered ForkJoinPool instead of newFixedThreadPool(N)? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-instead-tpe |
| Lazy initialization of a field should be thread-safe? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init-thread-safety |
| Considered double-checked locking for a lazy initialization to improve performance?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-dcl |
| Double-checked locking follows the SafeLocalDCL pattern? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#safe-local-dcl |
| Considered eager initialization instead of a lazy initialization to simplify code?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#eager-init |
| Can do lazy initialization with a benign race and without locking to improve performance?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init-benign-race |
| Holder class idiom is used for lazy static fields rather than double-checked locking?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#no-static-dcl |
| Non-blocking code has enough comments to make line-by-line checking as easy as possible?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#check-non-blocking-code |
| Can use immutable POJO + compare-and-swap operations to simplify non-blocking code?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#swap-state-atomically |
| Boundaries of non-blocking or benignly racy code are identified with WARNING comments?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-warning |
| Busy waiting (spin loop), all calls to Thread.yield() and Thread.onSpinWait() are justified?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-busy-wait |
| Thread is named? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#name-threads |
| Can use ExecutorService instead of creating a new Thread each time some method is called?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#reuse-threads |
| ExecutorServices are not created within short-lived objects (but rather reused)?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#reuse-threads |
| No network I/O in a CachedThreadPool? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cached-thread-pool-no-io |
| No blocking (incl. I/O) operations in a ForkJoinPool or in a parallel Stream pipeline?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-no-blocking |
| Can execute non-blocking computation in FJP.commonPool() instead of a custom thread pool?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-common-fjp |
| ExecutorService is shut down explicitly? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#explicit-shutdown |
| Callback is attached to a CompletableFuture (SettableFuture) in non-async mode only if
either: | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cf-beware-non-async |
| Adding a callback to a CompletableFuture (SettableFuture) in non-async mode is justified?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cf-beware-non-async |
| Actions are delayed via a ScheduledExecutorService rather than Thread.sleep()?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#no-sleep-schedule |
| Checked the result of awaitTermination()? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#check-await-termination |
| ExecutorService is not assigned into a variable of Executor
type? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#executor-service-type-loss |
| ScheduledExecutorService is not assigned into a variable of ExecutorService
type? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-scheduled-executor-service |
| Parallel Stream computation takes more than 100us in total? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-parallel-stream-use |
| Comment before a parallel Streams pipeline explains how it takes more than 100us in total?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-parallel-stream-use |
| Non-blocking computation needs to be decorated as a Future? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-future |
| Method returning a Future doesn't block? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#future-method-no-blocking |
| In a method returning a Future, considered wrapping an "expected" exception as a failed
Future? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#future-method-failure-paths |
| Interruption status is restored before wrapping InterruptedException with another exception?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#restore-interruption |
| InterruptedException is swallowed only in the following kinds of methods:
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#interruption-swallowing |
| InterruptedException swallowing is documented for a method? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#interruption-swallowing |
| Can use Guava's Uninterruptibles to avoid InterruptedException swallowing?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#interruption-swallowing |
| Future is canceled upon catching an InterruptedException or a TimeoutException on get()?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cancel-future |
| nanoTime() values are compared in an overflow-aware manner? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#nano-time-overflow |
| currentTimeMillis() is not used to measure time intervals and timeouts?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#time-going-backward |
| Units for a time variable are identified in the variable's name or via TimeUnit? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#time-units |
| Negative timeouts and delays are treated as zeros? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#treat-negative-timeout-as-zero |
| Tasks connected to system time or UTC time are not scheduled using
ScheduledThreadPoolExecutor? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#external-interaction-schedule |
| Human and external interactions on consumer devices are not scheduled using
ScheduledThreadPoolExecutor? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#user-interaction-schedule |
| ThreadLocal can be static final? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#tl-static-final |
| Can redesign a subsystem to avoid usage of ThreadLocal (esp. non-static one)?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threadlocal-design |
| ThreadLocal is not used just to avoid moderate amount of allocation?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threadlocal-performance |
| Considered replacing a non-static ThreadLocal with an instance-confined Map?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#tl-instance-chm |
| close() is concurrently idempotent in a class with a Cleaner or finalize()?
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#thread-safe-close-with-cleaner |
| Method accessing native state calls reachabilityFence() in a class with a Cleaner or
finalize()? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#reachability-fence |
| Cleaner or finalize() is used for real cleanup, not mere reporting? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#finalize-misuse |
| Considered making a class with native state thread-safe? | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#thread-safe-native |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#design |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#rationalize |
| justified in comments | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-document |
| unneeded thread-safety of classes and methods | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-thread-safety |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-patterns |
| RC.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#moving-state-race |
| NB.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#swap-state-atomically |
| persistent data
structures | https://en.wikipedia.org/wiki/Persistent_data_structure |
| Parallel
Streams | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#parallel-streams |
| TE.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-no-blocking |
| TE.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-common-fjp |
| Dl.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#avoid-nested-critical-sections |
| CSP | https://en.wikipedia.org/wiki/Communicating_sequential_processes |
| SEDA | https://en.wikipedia.org/wiki/Staged_event-driven_architecture |
| RC.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-iteration |
| RC.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-mutation-race |
| RC.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#moving-state-race |
| TL.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#tl-instance-chm |
| the checklist section about
ThreadLocals | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threadlocal |
| article on Wikipedia | https://en.wikipedia.org/wiki/Active_object |
| TE.6 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#explicit-shutdown |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#documentation |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-document |
| PS.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-parallel-stream-use |
| NB.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-warning |
| NB.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-busy-wait |
| unnecessary thread-safety | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-thread-safety |
| redundant atomics | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#redundant-atomics |
| redundant volatile modifiers | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-volatile |
| unneeded Futures | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-future |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threading-flow-model |
| Dn.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-patterns |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#immutable-thread-safe |
| CON52-J | https://wiki.sei.cmu.edu/confluence/display/java/CON52-J.+Document+thread-safety+and+use+annotations+where+applicable |
| Error Prone | https://errorprone.info/ |
| bug
pattern | https://errorprone.info/bugpattern/Immutable |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#name-patterns |
| Dn.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-patterns |
| double-checked locking | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init |
| spin looping | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-busy-wait |
| Dc.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#immutable-thread-safe |
| Dc.7 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guarded-by |
| LI.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init-benign-race |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-map-type |
| RC.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#chm-race |
| an inspection | https://github.com/apache/incubator-druid/pull/6898/files#diff-3aa5d63fbb1f0748c146f88b6f0efc81R239 |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#chm-type |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guarded-by |
| jcip-annotations | https://search.maven.org/artifact/net.jcip/jcip-annotations/1.0/jar |
| error_prone_annotations | https://search.maven.org/search?q=a:error_prone_annotations%20g:com.google.errorprone |
| jsr305 | https://search.maven.org/search?q=g:com.google.code.findbugs%20a:jsr305 |
| Error Prone | https://errorprone.info/ |
| statically check for unguarded accesses to fields
and methods with @GuardedBy annotations | https://errorprone.info/bugpattern/GuardedBy |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#document-benign-race |
| RC.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#moving-state-race |
| IS.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-visibility |
| IS.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-protection |
| RC.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-point-read |
| @LazyInit | http://errorprone.info/api/latest/com/google/errorprone/annotations/concurrent/LazyInit.html |
| error_prone_annotations | https://search.maven.org/search?q=a:error_prone_annotations%20g:com.google.errorprone |
| LI.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#safe-local-dcl |
| LI.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init-benign-race |
| NB.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-warning |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-volatile |
| Java Memory Model | https://docs.oracle.com/javase/specs/jls/se11/html/jls-17.html#jls-17.4 |
| Dc.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#name-patterns |
| here | https://shipilev.net/blog/2014/safe-public-construction/#_safe_publication |
| linearizability of values observed by reader threads | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#safe-local-dcl |
| unnecessary
atomic | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#redundant-atomics |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#plain-field |
| Dc.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-document |
| IS.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-visibility |
| IS.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-protection |
| RC.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-point-read |
| RC.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-iteration |
| RC.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-mutation-race |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#insufficient-synchronization |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#static-thread-safe |
| IS.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#dateformat |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-visibility |
| VNA00-J | https://wiki.sei.cmu.edu/confluence/display/java/VNA00-J.+Ensure+visibility+when+accessing+shared+primitive+variables |
| NB.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-busy-wait |
| Dc.10 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#plain-field |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-protection |
| JLS 17.7 | https://docs.oracle.com/javase/specs/jls/se11/html/jls-17.html#jls-17.7 |
| VNA05-J | https://wiki.sei.cmu.edu/confluence/display/java/VNA05-J.+Ensure+atomicity+when+reading+and+writing+64-bit+values |
| Dc.8 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#document-benign-race |
| Dc.10 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#plain-field |
| RC.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-point-read |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#server-framework-sync |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#dateformat |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#excessive-thread-safety |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#pseudo-safety |
| safe local double-checked locking pattern | http://hg.openjdk.java.net/code-tools/jcstress/file/9270b927e00f/tests-custom/src/main/java/org/openjdk/jcstress/tests/singletons/SafeLocalDCL.java#l71 |
| excessive for correctness | https://shipilev.net/blog/2014/safe-public-construction/#_correctness |
| * | https://shipilev.net/blog/2014/safe-public-construction/#_safe_initialization |
| Dc.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#immutable-thread-safe |
| UnsafeLocalDCL | http://hg.openjdk.java.net/code-tools/jcstress/file/9270b927e00f/tests-custom/src/main/java/org/openjdk/jcstress/tests/singletons/UnsafeLocalDCL.java#l71 |
| the section about double-checked locking | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#redundant-atomics |
| Dc.9 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-volatile |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-thread-safety |
| Ft.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-future |
| Dc.9 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-volatile |
| Dn.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#rationalize |
| Dc.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-document |
| CN.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#thread-safe-native |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-fairness |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#race-conditions |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#chm-race |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-point-read |
| this thread | http://cs.oswego.edu/pipermail/concurrency-interest/2018-September/016526.html |
| IS.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-protection |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-iteration |
| Sc.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-collections |
| RC.10 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#synchronized-collection-iter |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-mutation-race |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#moving-state-race |
| NB.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#swap-state-atomically |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#read-outside-critical-section-race |
| Arrays of Wisdom of the
Ancients | https://shipilev.net/blog/2016/arrays-wisdom-ancients/ |
| RC.9 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cache-invalidation-race |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#outside-world-race |
| java.nio.file.Files | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Files.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guava-cache-invalidation-race |
| race condition | https://github.com/google/guava/issues/1881 |
| Caffeine cache | https://github.com/ben-manes/caffeine |
| Sc.9 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#caffeine |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cache-invalidation-race |
| RC.8 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guava-cache-invalidation-race |
| RC.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#chm-race |
| lazily initialized state | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init |
| non-blocking concurrency | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking |
| NB.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#swap-state-atomically |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#synchronized-collection-iter |
| the Javadoc | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collections.html#synchronizedCollection(java.util.Collection) |
| RC.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unsafe-concurrent-iteration |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#testing |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#multi-threaded-tests |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-test-random |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#coordinate-test-workers |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#test-workers-interleavings |
| Runtime.getRuntime().availableProcessors() | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runtime.html#availableProcessors() |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-assert |
| ConcurrentUnit | https://github.com/jhalterman/concurrentunit |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#check-await |
| CountDownLatch.await() | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CountDownLatch.html#await(long,java.util.concurrent.TimeUnit) |
| Lock.tryLock() | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/Lock.html |
| Semaphore | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/Semaphore.html |
| RateLimiter | https://guava.dev/releases/28.1-jre/api/docs/com/google/common/util/concurrent/RateLimiter.html |
| Monitor.enter(...) | https://guava.dev/releases/28.1-jre/api/docs/com/google/common/util/concurrent/Monitor.html |
| Condition.await(...) | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/Condition.html#await(long,java.util.concurrent.TimeUnit) |
| separate
item | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#check-await-termination |
| Process.waitFor(...) | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Process.html#waitFor(long,java.util.concurrent.TimeUnit) |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#locks |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#avoid-wait-notify |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guava-monitor |
| Monitor | https://google.github.io/guava/releases/27.0.1-jre/api/docs/com/google/common/util/concurrent/Monitor.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-synchronized |
| ETS.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-fairness |
| LCK00-J | https://wiki.sei.cmu.edu/confluence/display/java/LCK00-J.+Use+private+final+lock+objects+to+synchronize+classes+that+may+interact+with+untrusted+code |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lock-unlock |
| try-finally idiom | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/Lock.html |
| @LockMethod | https://errorprone.info/api/latest/com/google/errorprone/annotations/concurrent/LockMethod.html |
| LCK08-J | https://wiki.sei.cmu.edu/confluence/display/java/LCK08-J.+Ensure+actively+held+locks+are+released+on+exceptional+conditions |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#avoiding-deadlocks |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#avoid-nested-critical-sections |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#document-locking-order |
| LCK07-J | https://wiki.sei.cmu.edu/confluence/display/java/LCK07-J.+Avoid+deadlock+by+requesting+and+releasing+locks+in+the+same+order |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#dynamic-lock-ordering |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-open-call |
| Sc.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#minimize-critical-sections |
| CompletableFuture | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html |
| ListenableFuture | https://guava.dev/releases/28.1-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html |
| TE.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-no-blocking |
| TE.7 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cf-beware-non-async |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#chm-nested-calls |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#improving-scalability |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#minimize-critical-sections |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#increase-locking-granularity |
| Guava’s Striped | https://github.com/google/guava/wiki/StripedExplained |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-collections |
| SnapTree | https://github.com/nbronson/snaptree |
| more efficient | https://github.com/apache/incubator-druid/pull/6719 |
| Sc.8 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#jctools |
| ForkJoinPool instead of newFixedThreadPool(N) | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-instead-tpe |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-class-value |
| ClassValue | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassValue.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#read-write-lock |
| Sc.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency##increase-locking-granularity |
| this comment | https://medium.com/@leventov/interesting-perspective-thanks-i-didnt-think-about-this-before-e044eec71870 |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-stamped-lock |
| StampedLock | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/StampedLock.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#long-adder-for-hot-fields |
| LongAdder | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/atomic/LongAdder.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#jctools |
| the JCTools
library | https://www.baeldung.com/java-concurrency-jc-tools |
| Sc.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-collections |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#caffeine |
| Caffeine | https://github.com/ben-manes/caffeine |
| Caffeine's performance | https://github.com/ben-manes/caffeine/wiki/Benchmarks |
| RC.8 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#guava-cache-invalidation-race |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#speculation |
| Optimistic concurrency control | https://en.wikipedia.org/wiki/Optimistic_concurrency_control |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-instead-tpe |
| this | http://cs.oswego.edu/pipermail/concurrency-interest/2020-January/017058.html |
| this | http://cs.oswego.edu/pipermail/concurrency-interest/2020-February/017061.html |
| using non-blocking collections (including queues) instead of blocking
ones | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-collections |
| using JCTools queues | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#jctools |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-initialization-and-double-checked-locking |
| Safe Publication this and Safe
Initialization in Java | https://shipilev.net/blog/2014/safe-public-construction/ |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init-thread-safety |
| RC.9 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cache-invalidation-race |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-dcl |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#safe-local-dcl |
| SafeLocalDCL | http://hg.openjdk.java.net/code-tools/jcstress/file/9270b927e00f/tests-custom/src/main/java/org/openjdk/jcstress/tests/singletons/SafeLocalDCL.java#l71 |
| ETS.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#pseudo-safety |
| UnsafeLocalDCL | http://hg.openjdk.java.net/code-tools/jcstress/file/9270b927e00f/tests-custom/src/main/java/org/openjdk/jcstress/tests/singletons/UnsafeLocalDCL.java#l71 |
| Wishful Thinking: Happens-Before Is The Actual Ordering | https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/#wishful-hb-actual |
| Date-Race-Ful Lazy Initialization for Performance | http://jeremymanson.blogspot.com/2008/12/benign-data-races-in-java.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#eager-init |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init-benign-race |
| @LazyInit | http://errorprone.info/api/latest/com/google/errorprone/annotations/concurrent/LazyInit.html |
| error_prone_annotations | https://search.maven.org/search?q=a:error_prone_annotations%20g:com.google.errorprone |
| NB.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-warning |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#no-static-dcl |
| lazy initialization holder class idiom | https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom |
| Safe
Publication and Safe Initialization in
Java | https://shipilev.net/blog/2014/safe-public-construction/ |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-and-partially-blocking-code |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#check-non-blocking-code |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#swap-state-atomically |
| RC.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#moving-state-race |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-blocking-warning |
| Dc.8 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#document-benign-race |
| LI.5 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#lazy-init-benign-race |
| Dc.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-document |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-busy-wait |
| Semaphore | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/Semaphore.html |
| CountDownLatch | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CountDownLatch.html |
| Exchanger | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/Exchanger.html |
| ListenableFuture | https://github.com/google/guava/wiki/ListenableFutureExplained |
| TE.7 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cf-beware-non-async |
| Awaitility | https://github.com/awaitility/awaitility |
| IS.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-volatile-visibility |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threads-and-executors |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#name-threads |
| forbidden-apis | https://github.com/policeman-tools/forbidden-apis |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#reuse-threads |
| active objects | https://en.wikipedia.org/wiki/Active_object |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cached-thread-pool-no-io |
| TE.7 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cf-beware-non-async |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-no-blocking |
| managedBlock() | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ForkJoinPool.html#managedBlock(java.util.concurrent.ForkJoinPool.ManagedBlocker) |
| TE.7 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cf-beware-non-async |
| Parallel Stream Guidance | http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html |
| the section about parallel Streams | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#parallel-streams |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-common-fjp |
| TE.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#name-threads |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#explicit-shutdown |
| while finalize() is not guaranteed to
ever be called | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#finalize() |
| ExecutorService objects must not be assinged into
variables and fields of Executor type | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#executor-service-type-loss |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cf-beware-non-async |
| completed | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html#complete(T) |
| Futures.addCallback() | https://guava.dev/releases/28.1-jre/api/docs/com/google/common/util/concurrent/Futures.html#addCallback-com.google.common.util.concurrent.ListenableFuture-com.google.common.util.concurrent.FutureCallback-java.util.concurrent.Executor- |
| directExecutor() | https://guava.dev/releases/28.1-jre/api/docs/com/google/common/util/concurrent/MoreExecutors.html#directExecutor-- |
| CompletionStage | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html |
| TE.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cached-thread-pool-no-io |
| TE.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-no-blocking |
| Dl.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#non-open-call |
| ListenableFuture.addListener() | https://guava.dev/releases/28.1-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html#addListener-java.lang.Runnable-java.util.concurrent.Executor- |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#no-sleep-schedule |
| ScheduledExecutorService | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html |
| Dc.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-document |
| TE.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-no-blocking |
| unbounded clock
drift | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#external-interaction-schedule |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#check-await-termination |
| AsynchronousChannelGroup | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/channels/AsynchronousChannelGroup.html |
| io.grpc.ManagedChannel | https://grpc.github.io/grpc-java/javadoc/io/grpc/ManagedChannel.html |
| gRPC-Java | https://github.com/grpc/grpc-java |
| Structural search
inspection | https://www.jetbrains.com/help/phpstorm/general-structural-search-inspection.html |
| not checking the result of CountDownLatch.await() | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#check-await |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#executor-service-type-loss |
| explicit shutdown of
ExecutorService objects | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#explicit-shutdown |
| Structural Search inspection | https://www.jetbrains.com/help/phpstorm/general-structural-search-inspection.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-scheduled-executor-service |
| ScheduledThreadPoolExecutor | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ScheduledThreadPoolExecutor.html |
| previous
item | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#executor-service-type-loss |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#parallel-streams |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#justify-parallel-stream-use |
| 100 microseconds | http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html |
| TE.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#fjp-no-blocking |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#futures |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-future |
| ETS.3 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-thread-safety |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#future-method-no-blocking |
| may not need to return
a Future | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#unneeded-future |
| multiple failure paths | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#future-method-failure-paths |
| Flow.Publisher | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/Flow.Publisher.html |
| org.reactivestreams.Publisher | https://www.reactive-streams.org/reactive-streams-1.0.3-javadoc/org/reactivestreams/Publisher.html |
| Observable | http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#future-method-failure-paths |
| the previous item | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#future-method-no-blocking |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#thread-interruption-and-future-cancellation |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#restore-interruption |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#interruption-swallowing |
| example | http://jcip.net/listings/NoncancelableTask.java |
| Uninterruptibles | https://google.github.io/guava/releases/27.0.1-jre/api/docs/com/google/common/util/concurrent/Uninterruptibles.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#cancel-future |
| canceled | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/Future.html#cancel(boolean) |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#time |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#nano-time-overflow |
| the documentation | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/System.html#nanoTime() |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#time-going-backward |
| JDK-8184271 | https://bugs.openjdk.java.net/browse/JDK-8184271 |
| leap second | https://en.wikipedia.org/wiki/Leap_second |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#time-units |
| TimeUnit | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/TimeUnit.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#treat-negative-timeout-as-zero |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#external-interaction-schedule |
| nanoTime() can drift against the system time and the UTC time. | https://medium.com/@leventov/cronscheduler-a-reliable-java-scheduler-for-external-interactions-cb7ce4a4f2cd |
| CronScheduler | https://github.com/TimeAndSpaceIO/CronScheduler |
| choosing between
ScheduledThreadPoolExecutor and CronScheduler | https://medium.com/@leventov/cronscheduler-a-reliable-java-scheduler-for-external-interactions-cb7ce4a4f2cd#4926 |
| Android-specific APIs | https://android.jlelse.eu/schedule-tasks-and-jobs-intelligently-in-android-e0b0d9201777 |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#user-interaction-schedule |
| neither ScheduledThreadPoolExecutor nor Timer account for machine
suspension | https://medium.com/@leventov/cronscheduler-a-reliable-java-scheduler-for-external-interactions-cb7ce4a4f2cd#dcfe |
| Android-specific APIs | https://android.jlelse.eu/schedule-tasks-and-jobs-intelligently-in-android-e0b0d9201777 |
| CronScheduler | https://github.com/TimeAndSpaceIO/CronScheduler |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threadlocal |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#tl-static-final |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threadlocal-design |
| TL.1 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#tl-static-final |
| TL.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#tl-instance-chm |
| Dc.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threading-flow-model |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#threadlocal-performance |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#tl-instance-chm |
| Dc.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/blob/master/threading-flow-model |
| Dn.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#use-patterns |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#thread-safety-of-cleaners-and-native-code |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#thread-safe-close-with-cleaner |
| JLS 12.6.2 | https://docs.oracle.com/javase/specs/jls/se11/html/jls-12.html#jls-12.6.2 |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#reachability-fence |
| CN.4 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#thread-safe-native |
| any method with an empty body is an effective emulation of reachabilityFence() | http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-February/051312.html |
| Reference.reachabilityFence() | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ref/Reference.html#reachabilityFence(java.lang.Object) |
| this discussion | http://cs.oswego.edu/pipermail/concurrency-interest/2015-December/014609.html |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#finalize-misuse |
| async-profiler | https://github.com/jvm-profiling-tools/async-profiler |
| async-profiler -e malloc | https://stackoverflow.com/questions/53576163/interpreting-jemaloc-data-possible-off-heap-leak/53598622#53598622 |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#thread-safe-native |
| CN.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#reachability-fence |
| java.util.zip.Deflater | http://hg.openjdk.java.net/jdk/jdk/file/a772e65727c5/src/java.base/share/classes/java/util/zip/Deflater.java |
| VarHandle.storeStoreFence() | https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/invoke/VarHandle.html#storeStoreFence() |
| # | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#forbid-jdk-internally-synchronized |
| forbidden-apis | https://github.com/policeman-tools/forbidden-apis |
| T.2 | https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrent-test-random |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#reading-list |
| Memory Model | https://docs.oracle.com/javase/specs/jls/se11/html/jls-17.html#jls-17.4 |
| final field
semantics | https://docs.oracle.com/javase/specs/jls/se11/html/jls-17.html#jls-17.5 |
| Safe Publication and Safe Initialization in Java | https://shipilev.net/blog/2014/safe-public-construction/ |
| Java Memory Model Pragmatics | https://shipilev.net/blog/2014/jmm-pragmatics/ |
| Close Encounters of The Java Memory Model Kind | https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/ |
| When to use parallel streams | http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html |
| SEI CERT Oracle Coding Standard for Java | https://wiki.sei.cmu.edu/confluence/display/java/SEI+CERT+Oracle+Coding+Standard+for+Java |
| Rule 08. Visibility and Atomicity (VNA) | https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88487824 |
| Rule 09. Locking (LCK) | https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88487666 |
| Rec. 18. Concurrency (CON) | https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88487352 |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#concurrency-checklists-for-other-programming-langugages |
| Concurrency and parallelism | http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#cp-concurrency-and-parallelism |
| Concurrency | https://golang.org/doc/effective_go.html#concurrency |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#authors |
| post on Medium | https://medium.com/@leventov/code-review-checklist-java-concurrency-49398c326154 |
| Roman Leventov | https://github.com/leventov |
| Marko Topolnik | https://stackoverflow.com/users/1103872/marko-topolnik |
| Matko Medenjak | https://github.com/mmedenjak |
| Chris Vest | https://github.com/chrisvest |
| Simon Willnauer | https://github.com/s1monw |
| Ben Manes | https://github.com/ben-manes |
| Gleb Smirnov | https://github.com/gvsmirnov |
| Andrey Satarin | https://github.com/asatarin |
| Benedict Jin | https://github.com/asdf2014 |
| Petr Janeček | https://stackoverflow.com/users/1273080/petr-jane%C4%8Dek |
| Java Concurrency Gotchas | https://www.slideshare.net/alexmiller/java-concurrency-gotchas-3666977 |
| Alex
Miller | https://github.com/puredanger |
| What is the most frequent concurrency issue you've
encountered in Java? | https://stackoverflow.com/questions/461896 |
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#no-copyright |
|
Readme
| https://patch-diff.githubusercontent.com/arnk14/java-concurrency#readme-ov-file |
| Please reload this page | https://patch-diff.githubusercontent.com/arnk14/java-concurrency |
|
Activity | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/activity |
|
0
stars | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/stargazers |
|
0
watching | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/watchers |
|
0
forks | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/forks |
|
Report repository
| https://patch-diff.githubusercontent.com/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2Farnk14%2Fjava-concurrency&report=arnk14+%28user%29 |
| Releases | https://patch-diff.githubusercontent.com/arnk14/java-concurrency/releases |
| Packages
0 | https://patch-diff.githubusercontent.com/users/arnk14/packages?repo_name=java-concurrency |
|
| https://github.com |
| Terms | https://docs.github.com/site-policy/github-terms/github-terms-of-service |
| Privacy | https://docs.github.com/site-policy/privacy-policies/github-privacy-statement |
| Security | https://github.com/security |
| Status | https://www.githubstatus.com/ |
| Community | https://github.community/ |
| Docs | https://docs.github.com/ |
| Contact | https://support.github.com?tags=dotcom-footer |