1.list参数问题(无warnnings)
public static void main(String[] args){
List<Object> list=new ArrayList<Object>();
list.add("ABDC");
list.add(1);
list.add(new Thread());
for(Object obj:list)System.out.println(obj);
打印结果:
ABDC
1
Thread[Thread-0,5,main]
public String toString() {
ThreadGroup group = getThreadGroup();
if (group != null) {
return "Thread[" + getName() + "," + getPriority() + "," +
group.getName() + "]";
} else {
return "Thread[" + getName() + "," + getPriority() + "," +
"" + "]";
}
}
2.list参数问题(有 warnnings)
public static void main(String[] args){
List list=new ArrayList();
list.add("ABDC");
list.add(1);
list.add(new Thread());
for(Object obj:list)System.out.println(obj);
打印结果:
ABDC
1
Thread[Thread-0,5,main]
warnnings:list是需要有参数的
3.ThreadLocal的同步机制
threadLocal和线程的同步这两种方式都用来解决多线程共享变量冲突问题
1)线程的同步是采用“以时间来换空间”的方式,锁的机制
2)ThreadLocal是采用“以空间来换时间”的方式,共享变量副本
hreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。
ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。比如书HashMap就是不安全的。
4.ThreadLocal的接口方法
- void set(Object value)设置当前线程的线程局部变量的值。
- public Object get()该方法返回当前线程所对应的线程局部变量。
- public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
- protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null
例子:
public static void a1(int a) {
a2(a);
}
public static void a2(int a) {
a3(a + 100);
}
public static void a3(int a) {
a4(a + 200);
}
public static void a4(int a) {
System.out.println(a + 300);
}
public static void main(String[] args) {
a1(100);
}
a1,a2,a3,a4都要定义一个参数用来接收输入参数
能不能通过ThreadLocal将a2,a3,a4改成无参的函数,使代码功能不变》
private static ThreadLocal<Integer> PARAM = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0;
}
};
public static void a1(int a) {
PARAM.set(a + 100);
a2();
}
public static void a2() {
PARAM.set(PARAM.get() + 200);
a3();
}
public static void a3() {
PARAM.set(PARAM.get() + 300);
a4();
}
public static void a4() {
System.out.println(PARAM.get());
}
public static void main(String[] args) {
a1(100);
}
ThreadLocal是保证变量是安全的
就想是乐观锁一样