一秒钟非线程安全类变线程安全类
1秒钟非线程安全类变线程安全类
先看一个非线程安全类的例子:
下面就稍加改造变成线程安全类:
方法1:使用ThreadLocal
方法2:使用同步关键字synchronized
方法3:使用锁
方法4:使用Atomic类型
先看一个非线程安全类的例子:
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); } }