首页 > 编程语言 >阅读《java并发编程实战》第三章

阅读《java并发编程实战》第三章

时间:2023-05-27 17:22:40浏览次数:38  
标签:BigInteger lastFactors java 编程 private class 并发 value public

阅读《java并发编程实战》第三章

第一个例子,没有重现

public class NoVisibility {
    private static boolean ready;
    private static int number;

    private static class ReaderThread extends Thread {
        public void run() {
            while (!ready) {
                Thread.yield();
            }
            System.out.println(number);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new ReaderThread().start();
        
		// 加入睡眠让子线程启动好,也无法重现
        // Thread.sleep(1000);

        number = 42;
        ready = true;
    }
}
// 结果:
    // 程序能正常结束,输出42。没有展示出可见性的问题。

例子:可变正数类

@NotThreadSafe
class MutableInteger {
    private int value;
    
    public int get() { return value; }
    public void set(int value) { this.value = value; }
}
// 通过添加synchronized锁,对get/set都要加
@ThreadSafe
class MutableInteger {
    private int value;

    public synchronized int get() { return value; }
    public synchronized void set(int value) { this.value = value; }
}

要点:加锁(内置锁或Lock)能保证可见性。当线程B执行由锁保护的同步代码块时,可以看到线程A之前在同一个同步代码块中的所有操作结果。【加锁的含义不仅仅局限于互斥行为,还包括内存的可见性】

要点2:volatile变量,是java语言提供的一个稍弱的同步机制,确保变量的更新操作通知到其他线程。
从内存可见性角度来看,写入volatile变量相当于退出同步代码块,而读取volatile变量就相当于进入同步代码块。

要点3:发布(publish)一个对象是指,使对象能在当前作用域之外的代码中使用。例如:将一个对象引用保存到其他代码可以访问的地方;或者在某个非私有得方法中返回该引用;或者将引用传递到其他类的方法中。

// 发布对象举例
class UnsafeStates {
    private String[] states = {"AK", "AL"};
    public String[] getStates() {
        return states;
    }
}

class Demo {
    public static Set<Secret> knownSecrets;
    
    public void initialize() {
        knownSecrets = new HashSet<Secret>();
    }
}

3-12, 3-13:

@Immutable
class OneValueCache {
    private final BigInteger lastNumber;
    private final BigInteger[] lastFactors;

    public OneValueCache(BigInteger lastNumber, BigInteger[] lastFactors) {
        this.lastNumber = lastNumber;
         // 有问题,没有对lastFactors做null判断
        this.lastFactors = Arrays.copyOf(lastFactors, lastFactors.length);
    }

    public BigInteger[] getFactors(BigInteger i) {
        if (lastNumber == null || !lastNumber.equals(i)) {
            return null;
        }
        return Arrays.copyOf(lastFactors, lastFactors.length);
    }
}

@ThreadSafe
class VolatileCachedFactorizer implements Servlet {
    private volatile OneValueCache cache = new OneValueCache(null, null);
    
    public void sevice(ServletRequest req, ServletResponse resp) {
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = cache.getFactors(i);
        if (factors == null) {
            factors = factor(i);
            cache = new OneValueCache(i, factors);
        }
        encodeIntoResponse(resp, factors);
    }
}

标签:BigInteger,lastFactors,java,编程,private,class,并发,value,public
From: https://www.cnblogs.com/xianzhon/p/17437035.html

相关文章

  • Java入门10(IO流)
    IO流(input/output)​ 数据运输的载体或者中间键字节流输入字节流(FileInputStream)​ 以字节为最小单元,读取任何类型的文件,但是要注意字符集类型的转换。publicstaticvoidtestFileInputStream(){//获取文件对象Filef=newFile("文件绝对路径balabala");//......
  • KiCAD加Quartus Prime的Verilog编程练习
         在淘宝买了大西瓜的FPGA开发板,准备结合实物理解一下FPGA代码。为什么选择大西瓜呢,因为便宜。虽然闲鱼可能有更便宜的开发板,但我没有闲鱼的账号。     数码管部分的电路是这样的:   这对于强迫症来说,有点不太友好,正好因为不用说都知道的原因,需要练......
  • java实现导入word模板导入试题
    ​ 最近有一个项目需要将一个word文档中的试题数据导入,并存储到数据库中。试题类型包括:单选题、多选题、判断题、填空题、简答题。支持图片导入(我的这篇是借鉴JAVA实现Excel、Word模板导入-JAVA-华仔部落,javapoi解析上传word试卷(题库管理系统)-爱码网)这两位大神的。废话......
  • java——微服务——spring cloud——Eureka——服务注册
           2步搞定:1、引入依赖    2、编写配置 user服务:           order服务:一样的处理                                        ......
  • java面试(10)
    1:java的基本类型有几种?String是不是基本类型?  在Java中一共有8种基本类型(primitivetype)。4种整型int、short、long、byte2种浮点型float、double1种表示Unicode编码字符的类型(字符型)char1种表示真值的类型boolean2:为什么String是final......
  • java面试(9)内存泄露
    1:Java中也存在栈内存泄露的情况?  在Java中,栈内存主要用于存储方法调用和本地变量。与堆内存不同,栈内存的分配和释放是由编译器和虚拟机自动处理的,通常不需要手动释放。  然而,如果在编写代码时出现一些问题,可能会导致栈内存泄露。以下是一些可能引起栈内存泄露的常见情......
  • java——微服务——spring cloud——Eureka——搭建Eureka服务
        创建新工程:    创建main函数,并添加注解      编写参数:     启动:     点击打开浏览器:              ......
  • 基于JAVA的sprinboot+vue车辆充电桩,附源码+数据库+论文+PPT
    1、项目介绍利用springboot、Java、idea和mysql数据库等知识点,结合相关设计模式、以及软件工程的相关知识,设计一个车辆充电桩管理系统,来进行记录用户的信息,以及系统信息的增删改查的功能,根据实现需求,系统需完成这些基本功能:(1)系统合理显示系统首页界面,管理员界面,用户界面和维修员......
  • 【㉿Java并发】对象有状态 & 无状态
    有状态就是有数据存储功能。有状态对象(StatefulBean),就是有变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。实例变量和类变量都是状态变量无状态就是一次操作,不能保存数据。无状态对象(StatelessBean),就是没有实例 变量的对象.不能保存数据,是不......
  • Java基础
    Java基础将一个对象作为参数传递是值传递还是引用传递?java中只有值传递没有引用传递!!!无论是基本数据类型还是引用类型都是值传递,引用类型传递的时地址的值newstring()和string的区别?newString是在堆空间中创建对象,而string是直接在常量池中赋值String不能被继承(Str......