Day8.10
Arrays 工具类
-
Arrays.toString(arr[])
数组转字符串
-
数组转集合 asList()
简单类型数组转集合
Arrays.asList(int [])会把整个数组整体当成一个元素放到集合中
Arrays.asList(引用类型) 直接转成集合
注意点:
转过来的集合长度是固定的,所以不能执行增加。删除,但是可以执行修改,更改,遍历
list.set(0,“aa”);
线程
默认情况下,主线程和垃圾回收线程都是由系统创建的,但是我们需要完成自己的功能—创建自己的线程对象,java将线程面向对象了,形成的类就是Thread,在Thread类内部执行任务的方法叫run()
注意:如果想让run作为任务区,必须让他去被自动调用.我们通过执行start()方法,来开启用线程,继而实现run方法的自动调用。
子线程名字从thread01开始
-
手动创建自己干活的线程继承Thread,重写run 方法并且创建对象调用
-
启用线程是通过对象的start方法,而不是手动调用run。因为线程获取cpu是随机的,run是线程的任务区,代表功能,如果手动执行run,此时线程可能没有拿到cpu,无法工作,操作失败,通过start让线程处于就绪状态,随时拥有抢cpu的能力,当抢到cpu后,再启动线程
-
可以改线程名字 写构造方法传参super(String name)或者在start之前setname
-
任务和线程分离
独立创建一个任务类implements Runnable接口
重写run方法 然后创建任务类对象 作为参数传给Thread的构造方法
用Thread线程对象干活
-
任务和线程不分离
几个线程对象共用的数据需要加static
-
线程安全解决办法 同步锁:同步代码块
synchronized(锁 对象){
//里面是多线程重复执行的代码块
}//对象可以是任意的 this(当前类对象) 字节码文件当前类Ticket.class (静态同步方法) obj
//因为字节码文件范围太大一般不用
要保证共享一个对象 不能用匿名子对象
-
单例(懒汉式)线程安全问题
-
public class SingleCase {
private static SingleCase instance=null;
private SingleCase(){}
public static SingleCase getInstance(){
if(instance==null){
synchronized (SingleCase.class){
if (instance==null){
instance=new SingleCase();
}
}
}
return instance;
}
}
双重锁机制
貌似双重锁不会正常工作
我认为双重锁机制之所以不能正常运行是因为,在new对象的时候,是有三个步骤的:分配内存空间,初始化对象,然后将内存地址赋值给变量;在这么三个步骤中,极有可能会在操作上进行重排序,在重排序的情况下,还没有初始化对象,先将内存地址赋值给了变量(这种情况是可能存在的),当线程B进入时,发现变量不为null,就会直接返回这个实例,然而此时可能拿到的是还没有初始化完成的对象。所以双重锁机制是不提倡使用的。
//Initialization on Demand Holder.模式
class mySingleleton{
private mySingleleton(){}
private static class SingletonHolder{
public final static mySingleleton instance=new mySingleleton();
}
public static mySingleleton getInstance(){
return SingletonHolder.instance;
}
}