一个类总结下~~~~
不对的地方请大家不吝赐教^^
package com.util;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.http.annotation.GuardedBy;
import org.apache.http.annotation.Immutable;
import org.apache.http.annotation.ThreadSafe;
@ThreadSafe
//@Immutable //程序内的变量一旦形成就不可改变 final( 如果变量是集合 那么集合内的引用将可变并不是final)
public class threadTest {
//线程同步策略@GuardedBy("this") 无状态的只能在这个类用 和AtomicLong显式锁(保证计数的原子性)
@GuardedBy("this")private final AtomicLong value=new AtomicLong(0);
//线程同步的方法synchronized(自动加互斥锁 只有一个线程可以访问此方法 )
//内置锁是可以重入的 jvm会给锁创建一个计数值和一个持有者,同一个持有者访问则计数值+1,执行完则—1直到为0 次锁释放(子类调用父类的示例)
public synchronized Long getvalue(){
return value.incrementAndGet();
}
//bad example线程readerthread可能永远循环下去、也可能输出42 或者输出0
//这就是没有同步的结果
private static boolean ready;
private static int number;
//解决方法 在变量上加private volatile static boolean ready; 这样将使ready对别的线程可见
//之所以这里不能出现看不见的状态 因为eclipse吧代码当成自己的任务去执行 都在一个进程下
public static class ReaderThread extends Thread{ //extends ThreadLocal线程封闭技术,不与线程共享数据,也就是不需要同步
public void run(){
while (!ready) {
//Thread.yield();//让线程进入执行状态,可加可不加
System.out.println(number);
}
}
}
public static void main(String[] args) throws InterruptedException {
new ReaderThread().start();
//Thread.sleep(1);
number=42;
// Thread.sleep(1);
ready=true;
}
}