Java Design Demo -Runnable的使用方式 多线程
2013-01-01 13:17
399 查看
反例A
得到结果最终结果是 (我的机器为例) 第2471个 耗时:1262
反思:可能没有任何措施使用多线程安全是一个问题,如上并发访问就出现了漏数据的问题。
Thread使用Runnable委托后改写其线程安全访问部分如下
返回的结果是第2500个 耗时:1265
值得注意的是关于synchronized的使用方法,如果将synchronized写在方法中那么
等价于synchronized(this){ .............}
警惕多线程synchronized(this)的陷阱 如下图synchronized总是对新对象加锁
以下是错误认识synchronized的反例 效果与反例A相同
另外使用synchronized同步的代码段尽可能少。这样能提高性能。
public class ThreadTest { static int k = 0; static long time; public static void main(String[] args) { // TODO Auto-generated method stub time = System.currentTimeMillis(); for (int i = 0; i < 2500; i++) { new Thread() { @Override public void run() { try { //加入耗时操作 sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } String str="第"+(++k)+"时间:"+(System.currentTimeMillis() - time); System.out.println(str); } }.start(); } } }
得到结果最终结果是 (我的机器为例) 第2471个 耗时:1262
反思:可能没有任何措施使用多线程安全是一个问题,如上并发访问就出现了漏数据的问题。
Thread使用Runnable委托后改写其线程安全访问部分如下
public class RunnableTest { static int k = 0; static long time; public static void main(String[] args) { // TODO Auto-generated method stub time = System.currentTimeMillis(); Runnable run = new Runnable() { @Override public void run() { try { // 加入耗时操作 Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (this) { String str = "第" + (++k) + "个 耗时:" + (System.currentTimeMillis() - time); System.out.println(str); } } }; for (int i = 0; i < 2500; i++) { new Thread(run).start(); } } }
返回的结果是第2500个 耗时:1265
值得注意的是关于synchronized的使用方法,如果将synchronized写在方法中那么
等价于synchronized(this){ .............}
警惕多线程synchronized(this)的陷阱 如下图synchronized总是对新对象加锁
以下是错误认识synchronized的反例 效果与反例A相同
public class ThreadTest { static int k = 0; static long time; public static void main(String[] args) { // TODO Auto-generated method stub time = System.currentTimeMillis(); for (int i = 0; i < 2500; i++) { new Thread() { @Override public synchronized void run() { synchronized (this) { try { // 加入耗时操作 sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } String str = "第" + (++k) + "个 耗时:" + (System.currentTimeMillis() - time); System.out.println(str); } } }.start(); } } }
另外使用synchronized同步的代码段尽可能少。这样能提高性能。
相关文章推荐
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- JAVA多线程实现的三种方式(继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程)
- java实现多线程的三种方式(thread、runnable、callable)
- Java中使用Runnable接口创建并启动多线程
- 遇到问题----java---多线程----线程数一直增加----web项目中线程池的正确使用方式
- Java 多线程学习(1)——实现多线程的两种方式Thread/Runnable
- 初学Java多线程:使用Runnable接口创建线程
- Java实现Runnable接口方式实现多线程的优势
- java--(多线程创建的两种方式Thread类和Runnable接口)
- Java多线程优化方法及使用方式
- Java多线程——thread及runnable的基本使用及交替执行
- JAVA_创建多线程方式二——实现Runnable(忽略线程安全)
- JAVA 多线程的简单实现(runnable接口方式)
- Java中使用匿名内部类创建多线程的3种方式
- JAVA多线程:什么时候使用哪种实现方式
- 初学Java多线程【3】:使用Runnable接口创建线程
- Java中使用匿名内部类创建多线程的3种方式
- Java【多线程知识总结(5)】比较继承Thread类创建线程和实现Runnable接口创建线程这两种方式
- Java多线程学习笔记1——线程的实现方式以及定时器的使用
- java 多线程实现方式Thread和Runnable之间差异