文章说明:黑色字体-已知,蓝色字体-所见即所得,红色字体-还需要再找资料弄明白的,黄色背景-提炼关键信息
参考资料:很多参考资料,段落下有原文链接到原作者
安全问题
多个线程访问统一资源出现的各种情况的问题。
线程不安全:不提供数据访问保护,在多线程环境中对数据进行修改,会出现数据不一致的情况。
线程安全:就是多线程环境中有对全局变量的变动时,需要对执行的代码块采用锁机制,当一个线程访问到某个数据时,其他线程需要等待当前线程执行完该代码块才可执行,不会出现数据不一致或者数据被污染。
以下都是线程不安全的:
1、StringBuilder
2、ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap集合
以下都是线程安全的:
1、StringBuffer
2、Vector、HashTable、Properties集合
同步锁synchronized
用synchronized锁解决线程安全问题。并发的同步则是保证在并发执行的环境中各个控制流可以有效执行,包括对资源的共享或互斥访问,以及代码功能逻辑循序。
线程同步有以下两种方式:
方法一:同步代码块
格式:在代码块声明上,加上 synchronized
注:同步代码块中的锁对象可以是任意对象,但多个线程时,要使用同一个锁对象才能够保证线程安全
总:没有锁的线程不能进入同步,在同步中的线程,不出去同步,就不会释放锁。
synchronized (锁对象) {
可能会产生线程安全问题的代码块
}
方法二:同步方法
- 普通方法同步
格式:在方法声明上加上 synchronized
注:同步方法中的锁对象是 this