一秒钟非线程安全类变线程安全类

1秒钟非线程安全类变线程安全类
先看一个非线程安全类的例子:
package info.yiwen.thread.safe;
/**
 * 该类是非线程安全类,因为有一个共享变量state。
 * 
 * 原因:当多个线程使用同一个NotThreadSafe类的一个对象时,
 * 也会共享该对象的state属性,故是非线程安全的。
 * 
 * 也因为该类是非线程安全的,所以该类也不能作为单例对象。
 * 
 * 但是稍加改造也可以成为线程安全的,改造的方法有使用ThreadLocal,使用同步等等
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:NotThreadSafe  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午09:58:13  
 * 修改备注:
 * @version
 */
public class NotThreadSafe {
	private boolean state;

	public boolean checkState() {
		return isState();
	}
	
	public boolean isState() {
		return state;
	}

	public void setState(boolean state) {
		this.state = state;
	}
}


下面就稍加改造变成线程安全类:
方法1:使用ThreadLocal
package info.yiwen.thread.safe;

/**
 * 该对象是一个线程安全的对象,他虽然有一个state属性,但是是放在ThreadLocal里的,
 * 也就是说表面上看state属性是属于本类的,其实是属于当前线程的。
 * 
 * 因为每个线程实际上拥有一个state的副本,因此,state属性是不共享的,除此之外,该类也没有其他的共享的属性,
 * 因此该类是线程安全的,可以作为单例对象。
 * 
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:ThreadSafeWithThreadLocal  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午10:02:35  
 * 修改备注:
 * @version
 */
public class ThreadSafeWithThreadLocal {
	private final static ThreadLocal<Boolean> state = new ThreadLocal<Boolean>();
	
	public ThreadSafeWithThreadLocal(boolean state) {
		this.state.set(state);
	}
	
	public boolean checkState() {
		return state.get();
	}

	public boolean getState() {
		return this.state.get();
	}

	public void setState(boolean state) {
		this.state.set(state);
	}
	
	
}


方法2:使用同步关键字synchronized
package info.yiwen.thread.safe;


/**
 * 该类也是线程安全的,该类有一个共享属性state,但是对state状态进行写的方法上都用了sysnchronized同步语句
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:ThreadSafeWithSynchronized  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午10:13:50  
 * 修改备注:
 * @version
 */
public class ThreadSafeWithSynchronized {
	
	private Boolean state;
	
	public boolean checkState() {
		return state;
	}

	public boolean isState() {
		return state;
	}

	public void setState(boolean state) {
		synchronized (this.state) {
			this.state = state;
		}
	}
	
	
}


方法3:使用锁
package info.yiwen.thread.safe;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * 该类也是线程安全的,该类有一个共享属性state,但是对state状态进行写的方法上都用了lock锁同步
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:ThreadSafeWithSynchronized  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午10:13:50  
 * 修改备注:
 * @version
 */
public class ThreadSafeWithLock {
	
	private Boolean state;
	
	private final Lock lock = new ReentrantLock();
	
	public boolean checkState() {
		return state;
	}

	public boolean isState() {
		return state;
	}

	public void setState(boolean state) {
		lock.lock();
		try {
			this.state = state;
		} finally {
			lock.unlock();
		}
	}
	
	
}


方法4:使用Atomic类型
package info.yiwen.thread.safe;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 该类是线程安全的,该类有一个属性,是用AtomicBoolean实现的,
 * Atomic类型会维护好线程安全以及他所持有的值的访问权限
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:ThreadSafeWithAtomicType  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午10:59:26  
 * 修改备注:
 * @version
 */

public class ThreadSafeWithAtomicType {
	private AtomicBoolean state = new AtomicBoolean();
	
	public boolean checkState() {
		return state.get();
	}

	public boolean getState() {
		return state.get();
	}

	public void setState(boolean state) {
		this.state.set(state);
	}
}