多线程-不可变对象设计模式

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修饰后  属性就不可变,即使开启线程在赋值时也不会成功

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值