java多线程 synchronized volatile Atomic LOCK的使用
2015-09-22 16:07
288 查看
java中可以使用 synchronized volatile Atomic LOCK进行多线程编程来实现线程安全。现对这几种方式进行演示与总结。
其中:
1. 单纯使用volatile是没有办法保证线程安全的
2. 使用synchronized和 lock要注意使用方法,要在主进程中创建lock对象的实例或定义synchronized方法
3. 使用Atomic 原子类也是可以保证线程安全的。
程序运行结果:
所有的子线程都结束了!
i>>>>>400000
vi>>>>>257432
si>>>>>222170
autoInteger>>>>>400000
synClassInt>>>>>400000
lockInt>>>>>400000
staticClassInt>>>>>266997
其中:
1. 单纯使用volatile是没有办法保证线程安全的
2. 使用synchronized和 lock要注意使用方法,要在主进程中创建lock对象的实例或定义synchronized方法
3. 使用Atomic 原子类也是可以保证线程安全的。
/** * @Package * @Description * @author chenj * @date 2015-9-14 下午11:09:40 * @version V1.0 */ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * * @author chenj| 2015-01-01 * */ public class TestMultiThread{ Object _object = new Object(); static int i=0; static Integer si = 0; static volatile Integer vi = 0; static AtomicInteger autoInteger = new AtomicInteger(); static int synClassInt = 0; static int lockInt = 0; static int staticClassInt = 0; static Lock lock = new ReentrantLock(); static Object _obj = new Object(); public void testVolatileInteger(Thread _thread1,Thread _thread2) throws Exception{ ExecutorService pool = Executors.newCachedThreadPool(); //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口 Thread t1 = _thread1; Thread t2 = _thread2; //将线程放入池中进行执行 pool.execute(t1); pool.execute(t2); //关闭线程池 pool.shutdown(); while(true){ if(pool.isTerminated()){ if(staticClassInt!=0){ System.out.println("所有的子线程都结束了!"); System.out.println("i>>>>>"+i); System.out.println("vi>>>>>"+vi); System.out.println("si>>>>>"+si); System.out.println("autoInteger>>>>>"+autoInteger); System.out.println("synClassInt>>>>>"+synClassInt); System.out.println("lockInt>>>>>"+lockInt); System.out.println("staticClassInt>>>>>"+staticClassInt); } break; } } } public synchronized static void testSychronizedMethod() { i++; } static class testSychronizedMethodClass extends Thread{ @Override public void run() { for(int k=0;k<200000;k++){ testValue(); } } public static void testValue() { staticClassInt++ ; } } public static void main(String[] args) throws Exception{ TestMultiThread testMultiThread = new TestMultiThread(); testMultiThread.testVolatileInteger(new ThreadSychronizedMethead(),new ThreadSychronizedMethead()); Thread.sleep(100); testMultiThread.testVolatileInteger(new ThreadStaticInteger(),new ThreadStaticInteger()); Thread.sleep(100); testMultiThread.testVolatileInteger(new ThreadStaticVolatileInteger(),new ThreadStaticVolatileInteger()); Thread.sleep(100); testMultiThread.testVolatileInteger(new ThreadAtomicInteger(),new ThreadAtomicInteger()); Thread.sleep(100); testMultiThread.testVolatileInteger(new ThreadSychronizedObjMethead(),new ThreadSychronizedObjMethead()); Thread.sleep(100); testMultiThread.testVolatileInteger(new ThreadLock(),new ThreadLock()); Thread.sleep(100); testMultiThread.testVolatileInteger(new TestMultiThread.testSychronizedMethodClass(),new TestMultiThread.testSychronizedMethodClass()); Thread.sleep(100); } } class ThreadStaticVolatileInteger extends Thread { @Override public void run() { for(int k=0;k<200000;k++){ TestMultiThread.vi++; } } } class ThreadAtomicInteger extends Thread { @Override public void run() { for(int k=0;k<200000;k++){ TestMultiThread.autoInteger.incrementAndGet(); } } } class ThreadStaticInteger extends Thread { @Override public void run() { for(int k=0;k<200000;k++){ TestMultiThread.si++; } } } class ThreadSychronizedMethead extends Thread { @Override public void run() { for(int k=0;k<200000;k++){ TestMultiThread.testSychronizedMethod(); } } public synchronized void test() { TestMultiThread.i++; } } class ThreadSychronizedObjMethead extends Thread { @Override public void run() { for(int k=0;k<200000;k++){ synchronized(TestMultiThread._obj){ TestMultiThread.synClassInt++; } } } } class ThreadLock extends Thread { @Override public void run() { for(int k=0;k<200000;k++){ lockObj(); } } public void lockObj(){ TestMultiThread.lock.lock(); try{ TestMultiThread.lockInt ++; }finally{ TestMultiThread.lock.unlock(); } } }
程序运行结果:
所有的子线程都结束了!
i>>>>>400000
vi>>>>>257432
si>>>>>222170
autoInteger>>>>>400000
synClassInt>>>>>400000
lockInt>>>>>400000
staticClassInt>>>>>266997
相关文章推荐
- test5.16
- Spring 代码知识查缺补漏
- FileChannel-Java 复制文件的高效方法
- eclipse调试java程序的九个技巧
- Spring Security hello world example
- JavaWeb开发中关于分页的实现
- Spring内部bean无法通过id获取
- week 3-1,3-2 java_se_1
- test5.15
- java 集合类
- 《Java编程思想》学习记录仪四 -- Java数组和作用域初步认识(第二章一切都是对象)
- Java虚拟机调优工具 jstack
- java 连接数据库mysql的语句怎么写
- Fragment中出现java.lang.NullPointerException 空指针 上下文为空时
- java学习9.21
- Java虚拟机的类加载机制
- 详解Java的自动装箱与拆箱(Autoboxing and unboxing)
- Java中必须了解的常用类
- HDU 3887 Counting Offspring(dfs序 + 树状数组)
- eclipse中提高编程效率的快捷键