{"id":16558001,"url":"https://github.com/typ0520/high-concurrency-learning","last_synced_at":"2026-04-19T02:32:39.781Z","repository":{"id":206005889,"uuid":"491168214","full_name":"typ0520/high-concurrency-learning","owner":"typ0520","description":null,"archived":false,"fork":false,"pushed_at":"2022-05-24T15:57:27.000Z","size":226,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-04T23:42:00.868Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/typ0520.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-05-11T15:25:59.000Z","updated_at":"2022-05-11T15:26:41.000Z","dependencies_parsed_at":"2023-11-07T15:03:42.805Z","dependency_job_id":null,"html_url":"https://github.com/typ0520/high-concurrency-learning","commit_stats":null,"previous_names":["typ0520/high-concurrency-learning"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/typ0520/high-concurrency-learning","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typ0520%2Fhigh-concurrency-learning","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typ0520%2Fhigh-concurrency-learning/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typ0520%2Fhigh-concurrency-learning/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typ0520%2Fhigh-concurrency-learning/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/typ0520","download_url":"https://codeload.github.com/typ0520/high-concurrency-learning/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typ0520%2Fhigh-concurrency-learning/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31991983,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-10-11T20:09:17.630Z","updated_at":"2026-04-19T02:32:39.762Z","avatar_url":"https://github.com/typ0520.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 线程状态\n\n- NEW 线程刚创建，还没有启动\n\n    当前线程新建出来但没有启动，比如新建一个线程时new Thread()，此时线程就处于New状态，如果线程调用的了start()方法，此时线程开始执行run()下面的方法，这时候线程的状态也就会从New变成Runnable状态。\n\n- RUNNABLE 可运行状态，线程调度器可以安排执行\n\n    在Java中，Runnable状态分为两种，一种是可能没有运行，正在等待CPU调度资源分配给线程使用，另外一种是已经正在运行。假设A线程正在执行，跑到一半分配的CPU资源被调度走做了别的事情，那么此时该线程会暂时不运行，等待重新分配CPU资源，这个时候线程的状态还是RUnnable状态不会做出改变。\n\n- BLOCKED 被阻塞，正在等待锁\n\n  线程从RUnnable状态变成Blocked状态只有一种途径，就是当线程进入到synchronized没有拿到当前代码块对应的monitor锁，这个时候线程就会进入到Blocked状态。\n\n- WAITING 等待被唤醒\n\n    线程从Runnable进入Waiting有以下三种情况：\n  - 线程调用了没有设置Timeout参数的Object.wait()方法。\n  - 线程调用了没有设置Timeout参数的Thread.join()方法。\n  - 线程调用了LockSupport.park()方法。\n  - Blocked状态是针对synchronized的monitor锁的，但是java中有很多种锁，例如：ReentrantLock。在这些锁中，如果线程没有获取到锁，就会直接进去Waiting状态，其实本质就是调用了LockSupport.park()，进入到Waiting状态。\n\n- TIMED WAITING 隔一段时间后自动唤醒\n\n    与Waiting是一样的。 线程进入到Timed Waiting状态有以下四种情况：\n\n  - 线程调用了设置时间参数的Thread.sleep(long millis)方法。\n  - 线程调用了设置时间参数的Object.wait(long timeout)方法。\n  - 线程调用了设置时间参数的Thread.join(long millis)方法。\n  - 线程调用了设置时间参数的LockSupport.parkNanos(long nanos)和LockSupport.parkUntil(long deadline)方法。\n\n- TERMINATED 线程结束\n\n    线程进入到Terminated有两种情况：\n  - run()方法中代码执行完毕，正常退出。 \n  - 出现没有捕获的异常，终止的run()方法，意外退出。\n\n```\nThread thread = new Thread();\nSystem.out.println(\"thread state: \" + thread.getState());\n```\n\n![](./images/thread-state.png)\n\n\u003e 参考 https://cloud.tencent.com/developer/article/1724049?from=15425\n\n# LockSupport.park LockSupport.unpark(\u0026thread)\n\n线程的挂起与唤醒\n\n\u003e 原理参考 https://blog.csdn.net/weixin_43767015/article/details/107207643\n\n# 停止线程\n\n- stop(废弃)\n\n  释放掉所有锁，容易产生数据不一致的问题，不建议使用\n\n- suspend、resume(废弃)\n  \n  原因同上\n\n- volatile\n\n  打断时间点不够精确，另外线程执行了sleep、wait、ReentrantLock.lockInterruptibly()时阻塞住了无法循环回去\n\n```\nprivate volatile boolean done = false;\n\npublic void run() {\n  while (!done) {\n    //do something\n  }\n}\n```\n\n- interrupt(建议)\n\n# 三大特性\n\n- 可见性\n\n  每个线程都有自己独立的栈空间，基本类型和对象引用的本地变量存储在线程栈中，对象的成员变量是跟随着对象本身存储在堆上的。\n  多核CPU状态下，不同的线程可能会在不同的核上执行，成员变量会被放入核的L1、L2、L3 cache中，读写时只是修改缓存的副本，只有等待下次刷新缓存行时才会同步到主存，\n  java层成员变量加上volatile可以保证CPU读的时候从主存获取，CPU写的时候立即同步到主存，另外java层某些操作会触发与主存的同步（例如: synchronized(this)）\n\n  ![](./images/java_mem.png)\n\n  ![](./images/java_mem2.png)\n\n  \u003e 参考 [https://www.jianshu.com/p/a3f9f2c3ecf8](https://www.jianshu.com/p/a3f9f2c3ecf8)\n\n- 有序性\n\n  volatile\n  CPU执行指令时存在乱序的可能，存在的条件如下:\n  - as-if-serial\n  - 不影响单线程的最终一致性\n\n- 原子性\n\n  CAS、synchronized\n\n# 缓存行\n\n  CPU刷缓存时时批量操作的，缓存行的单位是64k；缓存行越大，局部性空间效率越高，但读取时间慢；缓存行越小，局部空间效率越低，但读取时间快；取一个折中值，目前多用: 64字节\n\n# 缓存一致性协议\n\n- MESI\n  \n  Modified Exclusive Shared Invalid\n\n# DCL double check lock\n\n  单例使用\n\n# 对象的内存布局\n\n  8字节对齐，对象头(markword(8字节)、类型指针)，默认开启类型指针压缩和普通对象指针(oops)压缩(4字节)\n\n  -XX:-UseCompressedClassPointer 禁止压缩类型指针\n  -XX:-UseCompressedOops 禁止压缩普通对象指针\n\n  - ## 普通对象\n    - markword(锁信息、identity hashcode、gc信息)(8字节)\n    - 类型指针(4字节) 指向class对象的指针\n    - 实例数据 \n    - 对齐数据\n\n  - ## 数组\n  - markword(锁信息、identity hashcode、gc信息)\n  - 类型指针\n  - 数组长度\n  - 实例数据\n  - 对齐数据\n\n  对象内存查看工具\n  ```\n  implementation 'org.openjdk.jol:jol-core:0.16'\n  \npublic class ClassMemorySample {\n    private static class T {\n        int m = 0;\n        String str = \"ss\";\n    }\n    @Test\n    public void test() {\n        Object obj = new Object();\n        System.out.println(ClassLayout.parseInstance(obj).toPrintable());\n        obj.hashCode();\n        synchronized (obj) {\n            System.out.println(ClassLayout.parseInstance(obj).toPrintable());\n        }\n        System.out.println(\"-----------------------------------\");\n        Object[] array = new Object[]{new Object(), new Object()};\n        System.out.println(ClassLayout.parseInstance(array).toPrintable());\n\n        System.out.println(\"-----------------------------------\");\n        T t = new T();\n        System.out.println(ClassLayout.parseInstance(t).toPrintable());\n    }\n}\n\njava.lang.Object object internals:\nOFF  SZ   TYPE DESCRIPTION               VALUE\n  0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)\n  8   4        (object header: class)    0xf80001e5\n 12   4        (object alignment gap)    \nInstance size: 16 bytes\nSpace losses: 0 bytes internal + 4 bytes external = 4 bytes total\n\njava.lang.Object object internals:\nOFF  SZ   TYPE DESCRIPTION               VALUE\n  0   8        (object header: mark)     0x000070000a70f100 (thin lock: 0x000070000a70f100)\n  8   4        (object header: class)    0xf80001e5\n 12   4        (object alignment gap)    \nInstance size: 16 bytes\nSpace losses: 0 bytes internal + 4 bytes external = 4 bytes total\n\n-----------------------------------\n[Ljava.lang.Object; object internals:\nOFF  SZ               TYPE DESCRIPTION               VALUE\n  0   8                    (object header: mark)     0x0000000000000001 (non-biasable; age: 0)\n  8   4                    (object header: class)    0xf800234d\n 12   4                    (array length)            2\n 12   4                    (alignment/padding gap)   \n 16   8   java.lang.Object Object;.\u003celements\u003e        N/A\nInstance size: 24 bytes\nSpace losses: 4 bytes internal + 0 bytes external = 4 bytes total\n\n-----------------------------------\n_1_threadbasic._openjdk_jol$T object internals:\nOFF  SZ               TYPE DESCRIPTION               VALUE\n  0   8                    (object header: mark)     0x0000000000000001 (non-biasable; age: 0)\n  8   4                    (object header: class)    0xf802ca13\n 12   4                int T.m                       0\n 16   4   java.lang.String T.str                     (object)\n 20   4                    (object alignment gap)    \nInstance size: 24 bytes\nSpace losses: 0 bytes internal + 4 bytes external = 4 bytes total\n  ```\n \n# 对象定位\n\n- 句柄\n- 直接\n\n# 对象分配\n\n首先尝试在栈上分配 -\u003e 然后线程本地缓冲区(TLAB) -\u003e eden -\u003e s1 s2 -\u003e 老年代\n\n# volatile\n\n# 锁\n- synchronized\n\n  https://mp.weixin.qq.com/s/9O-8Rs-LAUrdXSLOpUFTyQ\n\n- JUC(底层使用CAS)\n\n  悲观锁/乐观锁\n  公平锁/非公平锁\n\n\nReentrantLock底层用的是AQS\n\n# AQS\n\n# 线程池\n\n- ThreadPoolExecutor\n\n- ForkJoinPoll  ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftyp0520%2Fhigh-concurrency-learning","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftyp0520%2Fhigh-concurrency-learning","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftyp0520%2Fhigh-concurrency-learning/lists"}