1 不可变对象[里面的任何属性或者引用类型的属性都是final修饰的]一定是线程安全的
2 可变对象不一定是线程安全的
我们用到的哪些线程不安全的框架
servlet 不是线程安全的
struts 1.x 不是线程安全的
[struts 2.x 是线程安全的]
[stringbuffer 是线程安全的 但是属性并不是final,只是每个方法上都加了串型化锁]
接下来我们写一个简单的代码看看:
package com.handsome.thread2study.chapter7;
/**
* @author jiangkunli
* @date 2020-07-12 11:56 下午
* @description 学生对象
*/
public class Person {
private final String name;
private final String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
package com.handsome.thread2study.chapter7;
/**
* @author jiangkunli
* @date 2020-07-13 12:25 上午
* @description 使用person
*/
public class UsePersonThread extends Thread{
private Person person;
public UsePersonThread(Person person) {
this.person = person;
}
@Override
public void run() {
while (true){
System.out.println(Thread.currentThread().getName() + " print " + person.toString());
}
}
}
package com.handsome.thread2study.chapter7;
import java.util.stream.IntStream;
/**
* @author jiangkunli
* @date 2020-07-13 12:27 上午
* @description 不可变client
*/
public class ImmutableClient {
public static void main(String[] args) {
// 共享数据
Person person = new Person("Alex", "甘肃");
IntStream.range(0,5).forEach(i -> {
new UsePersonThread(person).start();
});
}
}
我们输出会发现输出结果一定是 alex 甘肃
这是因为final修饰后 属性就不可变,即使开启线程在赋值时也不会成功