当同时满足以下三个条件时,才可能引发线程安全问题
- 多线程环境。
- 有共享数据 。
- 多条语句操作共享数据 / 单条语句本身非原子操作 。
多程 | 任务对象 | 测试方法1 | 测试方法2 | 结果 |
---|---|---|---|---|
多线程访问 | 不同任务对象 | 爱啥啥无所谓 | 爱啥啥无所谓 | 并发执行 |
私有锁 | ||||
多线程访问 | 同一任务对象 | synchronized (lock) | synchronized (lock) | 同步阻塞 |
多线程访问 | 同一任务对象 | synchronized (new String()) | synchronized (new String()) | 并发执行 |
对象锁 | ||||
多线程访问 | 同一任务对象 | synchronized (this) | synchronized (this) | 同步阻塞 |
多线程访问 | 同一任务对象 | synchronized method_syn() | synchronized method_syn() | 同步阻塞 |
多线程访问 | 同一任务对象 | synchronized (this) | synchronized method_syn() | 同步阻塞 |
私有锁和对象锁互不影响 | ||||
多线程访问 | 同一任务对象 | synchronized (lock) | synchronized method_syn() | 并发执行 |
多线程访问 | 同一任务对象 | synchronized (lock) | synchronized (this) | 并发执行 |
类锁 | ||||
多线程访问 | 同一任务对象 | static synchronized method_syn_static() | static synchronized method_syn_static() | 同步阻塞 |
多线程访问 | 同一任务对象 | synchronized (Service.class) | synchronized (Service.class) | 同步阻塞 |
多线程访问 | 同一任务对象 | static synchronized method_syn_static() | synchronized (Service.class) | 同步阻塞 |
类锁对象锁互不影响 | ||||
多线程访问 | 同一任务对象 | synchronized (Service.class) | synchronized (this) | 并发执行 |
多线程访问 | 同一任务对象 | synchronized (Service.class) | synchronized method_syn() | 并发执行 |
多线程访问 | 同一任务对象 | static synchronized method_syn_static() | synchronized (this) | 并发执行 |
多线程访问 | 同一任务对象 | static synchronized method_syn_static() | synchronized method_syn() | 并发执行 |
类锁私有锁互不影响 | ||||
多线程访问 | 同一任务对象 | synchronized (lock) | synchronized (Service.class) | 并发执行 |
多线程访问 | 同一任务对象 | synchronized (lock) | static synchronized method_syn_static() | 并发执行 |