如何搭建电影网站服务器?制作一个电影网站需要多少预算?
摘要:怎么做电影网站服务器,做网站需要哪些钱,电脑上怎么安装wordpress,禄劝网络推广外包一、变量的线程安全分析 成员变量和静态变量是否线程安全? ● 如果它们没有共享,则线程安全
怎么做电影网站服务器,做网站需要哪些钱,电脑上怎么安装wordpress,禄劝网络推广外包一、变量的线程安全分析
成员变量和静态变量是否线程安全#xff1f;
● 如果它们没有共享#xff0c;则线程安全 ● 如果它们被共享了#xff0c;根据它们的状态是否能够改变#xff0c;又分两种情况 —— 如果只有读操作#xff0c;则线程安全 —— 如果有读写操作
● 如果它们没有共享则线程安全 ● 如果它们被共享了根据它们的状态是否能够改变又分两种情况 —— 如果只有读操作则线程安全 —— 如果有读写操作则这段代码是临界区需要考虑线程安全
局部变量是否线程安全 ● 局部变量是线程安全的 ● 但局部变量引用的对象则未必 —— 如果该对象没有逃离方法的作用访问它是线程安全的 —— 如果该对象逃离方法(eg使用return)的作用范围需要考虑线程安全
1.1 线程安全分析-局部变量
public static void test1() {int i 10;i;
}每个线程调用 test1() 方法时局部变量 i会在每个线程的栈帧内存中被创建多份因此不存在共享
反编译后的二进制字节码
public static void test1();descriptor: ()V
flags: ACC_PUBLIC, ACC_STATICCode:stack1, locals1, args_size00: bipush 10 // 准备常数10赋值给i2: istore_0 // 赋值给i3: iinc 0, 1 // 在局部变量i的基础上自增 6: return // 方法运行结束返回LineNumberTable:line 10: 0line 11: 3line 12: 6LocalVariableTable:Start Length Slot Name Signature3 4 0 i I每个方法调用时都会创建一个栈帧每个线程有自己独立的栈和栈帧内存局部变量会在栈帧中被创建多份 如图 若局部变量的为对象则稍有不同 观察一个成员变量的例子
public class TestThreadSafe {// 创建两个线程每个线程调用method1循环200次static final int THREAD_NUMBER 2;static final int LOOP_NUMBER 200;public static void main(String[] args) {ThreadUnsafe test new ThreadUnsafe();for (int i 0; i THREAD_NUMBER; i) {new Thread(() - {test.method1(LOOP_NUMBER);}, Thread (i1)).start();}}
}
class ThreadUnsafe {ArrayListString list new ArrayList();public void method1(int loopNumber) {for (int i 0; i loopNumber; i) {// { 临界区, 会产生竞态条件// method2()、method3()访问的为共享资源多个线程执行时会发生指令交错method2();method3();// } 临界区}}private void method2() {// 往集合中加一个元素list.add(1);}// 往集合中移除一个元素private void method3() {list.remove(0);}
}多个线程执行时会发生指令交错会产生问题
运行结果其中一种情况是线程1的method2()还未add线程2的method3()尝试移除此时集合为空就会报错
分析 ● 无论哪个线程中的 method2 引用的都是同一个对象中的 list 成员变量 ● method3 与 method2 分析相同 若将 list 修改为局部变量就不会存在上述问题
class ThreadSafe {public final void method1(int loopNumber) {ArrayListString list new ArrayList();for (int i 0; i loopNumber; i) {method2(list);method3(list);}}public void method2(ArrayListString list) {list.add(1);}private void method3(ArrayListString list) {Syste
