java静态内部类线程安全问题_静态内部类-以及它的线程安全问题

导丝男士java静态部类线程安全问题_静态内部类-以及它的线程安全
问题
最近⽤上了静态内部类,作为建造者模式.
⾃然就会有个疑问.静态内部类,会不会有线程安全的问题?因为静态的,那么这个静态内部类是所有的外部类实例共⽤⼀个呢(这样会有线程安
全的问题),
还是每个实例有⾃⼰对应的静态内部类实例?(这样不会有线程安全的问题)
根据测试结果,静态内部成员类,没有出现线程安全的问题.
com.st.DuoShuXingGouZhaoQiCeShiB u i l d e r @ 65 e b 1 b 78 c o m . i t r u s . p o r t a l . c o m m
o n . t e s t . D u o S h u X i n g G o u Z h a o Q i C e S h i Builder@65eb1b78
com.st.DuoShuXingGouZhaoQiCeShiBuilder@65eb1b78com.st.DuoShuXingGouZhaoQ
因为虽然静态内部类是静态的,但是调⽤DuoShuXingGouZhaoQiCeShi.Builder builder = new
DuoShuXingGouZhaoQiCeShi.Builder(page, size);
的时候,都会新⽣成⼀个builder对象,只是⽤了静态的⽅式来标识他不属于某个对象,⽽是属于类.
就类似于我们在类A中定义puiblic static String s1;
就类似于我们在类B中定义puiblic static String s2;
s1和s2⾃然是两个实例.
package com.st;
public class Main {
/**
* 开始ThreadTest
开始ThreadTest2
DuoShuXingGouZhaoQiCeShi [page=2, size=2, fat=2]
结束ThreadTest2
DuoShuXingGouZhaoQiCeShi [page=1, size=1, fat=1]
标准件库结束ThreadTest
com.st.DuoShuXingGouZhaoQiCeShi$Builder@65eb1b78
com.st.DuoShuXingGouZhaoQiCeShi$Builder@3e4a0b0a
根据测试结果,静态内部成员类,没有出现线程安全的问题.
因为虽然静态内部类是静态的,但是调⽤DuoShuXingGouZhaoQiCeShi.Builder builder = new
DuoShuXingGouZhaoQiCeShi.Builder(page, size);
的时候,都会新⽣成⼀个builder对象,只是⽤了静态的⽅式来标识他不属于某个对象,⽽是属于类.
就⾏平常我们定义了⼀个静态成员⼀样,难道这个静态成员全局就只有⼀个实例吗,当然不是,在其他类或者地⽅也会有这个类对应的实例.
所以静态内部类和平常的内部类唯⼀的⼏点不同就是
3.静态内部类有特殊的地⽅吗?
从前⾯可以知道,静态内部类是不依赖于外部类的,也就说可以在不创建外部类对象的情况下创建内部类的对象。另外,静态内部类是不持有指向外部类对象的引⽤的,这个读者可以⾃⼰尝试反编译class⽂件看⼀下就知道了,是没有Outter this&0引⽤的。
4.静态内部类
静态内部类也是定义在另⼀个类⾥⾯的类,只不过在类的前⾯多了⼀个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使⽤外部类的⾮static成员变量或者⽅法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的⾮static成员就会产⽣⽭盾,因为外部类的⾮static成员必须依附于具体的对象。
昆明理工大学楚雄应用技术学院⽽静态内部类不⽤产⽣外部类的实例化对象即可产⽣内部类的实例化对象
* @param args
*/
public static void main(String[] args) {
ThreadTest test = new ThreadTest(1, 1, 1);
ThreadTest2 test2= new ThreadTest2(2, 2, 2);
test.start();
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
test2.start();
}
}
测试类
package com.st;
public class DuoShuXingGouZhaoQiCeShi {
private final int page;
private final int size;
private final int fat;
/**
* 测试静态内部类的线程安全问题
* @author he_guanhong
*
*/
public static class Builder{
//必须输⼊的值
private final int page;
private final int size;
//其他可选的值,默认
private int fat = 0;
public Builder(int page,int size){
this.page = page;
循证医学this.size = size;gep
}
public Builder fat(int fat){
this.fat = fat;
return this;
}
public DuoShuXingGouZhaoQiCeShi build(){
return new DuoShuXingGouZhaoQiCeShi(this);
}
}
private DuoShuXingGouZhaoQiCeShi(Builder builder){
this.page = builder.page;
this.size = builder.size;
this.fat = builder.fat;
}
@Override
public String toString() {
return "DuoShuXingGouZhaoQiCeShi [page=" + page + ", size=" + size + ", fat=" + fat + "]";
}
}
package com.st;
public class ThreadTest extends Thread{
private int page;
private int size;
private int fat;
菅直人public ThreadTest(int page, int size, int fat) {
super();
this.page = page;
this.size = size;
this.fat = fat;
}
public void run(){
System.out.println("开始ThreadTest");
DuoShuXingGouZhaoQiCeShi.Builder builder = new DuoShuXingGouZhaoQiCeShi.Builder(page, size); try {
sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DuoShuXingGouZhaoQiCeShi duoShuXingGouZhaoQiCeShi =builder.fat(fat).build();
System.out.println(duoShuXingGouZhaoQiCeShi);
System.out.println("结束ThreadTest");
};
}
package com.st;
public class ThreadTest2 extends Thread{
private int page;
private int size;
private int fat;
public ThreadTest2(int page, int size, int fat) {
super();
this.page = page;
this.size = size;
this.fat = fat;
}
public void run() {
System.out.println("开始ThreadTest2");
DuoShuXingGouZhaoQiCeShi.Builder builder = new DuoShuXingGouZhaoQiCeShi.Builder(page, size); DuoShuXingGouZhaoQiCeShi duoShuXingGouZhaoQiCeShi =builder.fat(fat).build();
System.out.println(duoShuXingGouZhaoQiCeShi);
System.out.println("结束ThreadTest2"); };
}

本文发布于:2024-09-22 01:55:35,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/373776.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:静态   部类   对象   成员   线程
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议