java并发基础与安全学习笔记

一个类总结下~~~~

不对的地方请大家不吝赐教^^

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;
}





}


你可能感兴趣的:(java并发基础与安全学习笔记)