{"id":16169574,"url":"https://github.com/jabrena/101-concurrency","last_synced_at":"2025-07-08T04:36:24.632Z","repository":{"id":48025319,"uuid":"516422983","full_name":"jabrena/101-concurrency","owner":"jabrena","description":"Detecting concurrency issues with JCStress","archived":false,"fork":false,"pushed_at":"2022-09-21T13:52:51.000Z","size":19783,"stargazers_count":2,"open_issues_count":6,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-13T20:23:16.385Z","etag":null,"topics":["concurrency","java","jvm","meetup","talk","thread-safety"],"latest_commit_sha":null,"homepage":"https://jabrena.github.io/101-concurrency/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jabrena.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-07-21T15:20:47.000Z","updated_at":"2023-01-27T14:46:53.000Z","dependencies_parsed_at":"2022-08-12T17:00:16.215Z","dependency_job_id":null,"html_url":"https://github.com/jabrena/101-concurrency","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabrena%2F101-concurrency","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabrena%2F101-concurrency/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabrena%2F101-concurrency/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabrena%2F101-concurrency/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jabrena","download_url":"https://codeload.github.com/jabrena/101-concurrency/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247707770,"owners_count":20982847,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["concurrency","java","jvm","meetup","talk","thread-safety"],"created_at":"2024-10-10T03:15:17.862Z","updated_at":"2025-04-07T18:35:42.541Z","avatar_url":"https://github.com/jabrena.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 101 concurrency\n\nDetecting concurrency issues with JCStress\n\n[![Java CI](https://github.com/jabrena/101-concurrency/actions/workflows/build.yml/badge.svg)](https://github.com/jabrena/101-concurrency/actions/workflows/build.yml)\n\n\n[![SonarCloud](https://sonarcloud.io/images/project_badges/sonarcloud-white.svg)](https://sonarcloud.io/summary/new_code?id=jabrena_101-concurrency)\n\n[![](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/jabrena/101-concurrency)\n\n## Elevator Pitch\n\nJava is a very popular programming language\nwith a consistent set of multithreading and multiprocessing features, which solve\nall kinds of modern enterprise problems and enable memory sharing across threads as part of the Java\nconcurrency model.\n\nDevelopers use popular frameworks like `Spring`, `Quarkus`,\n`Micronaut`, `Akka` or `Spark` every day. In some scenarios, it is necessary to use\nconcurrency, although in reality the learning curve is not easy and sometimes\nsoftware gets deployed to cloud environments with some hidden concurrency bugs.\n\nThe talk will review the root causes of concurrency issues, and give an\nintroduction into the Java tool `JCStress` by explaining how to create tests\nfor Java classes with shared states.\n\n## When\n\n- https://www.meetup.com/nl-NL/amsterdam-java-user-group/events/287658432/\n\n## How to run locally\n\nRunning the example locally:\n\n```\nsdk env\n./gradlew clean build jcstress\n./gradlew clean jcstress --tests \"Calculator4Test\"\n./gradlew clean build\n./gradlew clean bootRun\n```\n\n```\nhttp://localhost:8080/swagger-ui/index.html\nhttp://localhost:8080/v3/api-docs\nhttps://editor.swagger.io/\n```\n\nRunning Visualvm, Jmeter \u0026 Taurus to add load:\n\n```\nsdk install visualvm\nvisualvm --jdkhome  $JAVA_HOME\n\njava -Xms256m -Xmx256m -XX:+UseParallelGC -jar build/libs/101-concurrency-0.1.0-SNAPSHOT.jar\nsdk install jmeter\njmeter -t jmeterConf.jmx\njmeter -t jmeterConf.jmx -n\njmeter -t jmeterConf2.jmx\n\nbrew install python\npython3 --version\npip3 install bzt\nbzt taurusConf.yaml\n```\n\nRunning JCStress examples:\n\n```\n./gradlew clean jcstress --tests \"API_01_Simple\"\n./gradlew clean jcstress --tests \"API_02_Arbiters\"\n./gradlew clean jcstress --tests \"API_04_Nesting\"\n./gradlew clean jcstress --tests \"API_05_SharedMetadata\"\n./gradlew clean jcstress --tests \"API_06_Descriptions\"\n```\n\n## Documentation\n\n```\nsdk env\njwebserver -p 8000 -d  $PWD/docs\n```\n\n## References\n\n- https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html\n- https://download.oracle.com/otndocs/jcp/memory_model-1.0-pfd-spec-oth-JSpec/\n- https://gee.cs.oswego.edu/dl/jmm/cookbook.html\n- https://github.com/openjdk/jcstress\n- https://github.com/reyerizo/jcstress-gradle-plugin\n- https://shipilev.net/talks/hydraconf-June2021-jcstress-workshop.pdf\n- https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/\n- https://shipilev.net/blog/2014/safe-public-construction/\n- https://shipilev.net/blog/2014/jmm-pragmatics/\n- https://shipilev.net/jvm/anatomy-quarks/jvm-anatomy-quarks-complete.pdf\n- https://jenkov.com/tutorials/java-concurrency/java-memory-model.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjabrena%2F101-concurrency","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjabrena%2F101-concurrency","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjabrena%2F101-concurrency/lists"}