`
reilost
  • 浏览: 16876 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

并发总结(1)

    博客分类:
  • Java
阅读更多
并发总结(2)

Java在顺序型语言的基础上提供对线程的支持.线程机制是在由执行程序表示的单一进程中创建任务.Java中的线程机制是抢占式的,调度机制会周期性的中断线程,将上下文切换到另一个线程,从而为每一个线程都系统时间片,使每个线程都会分到数量合理的时间去驱动他的任务.
1.使用线程
线程可以驱动任务,所以我们需要描述一个任务.
实现Runnable接口.编写run()方法,但是这样一个方法并没有产生线程的能力,要实现线程行为,就必须把这个任务附到一个线程上.这个方式就是把他提交给Thread..

执行thread的start方法后是迅速返回的
	public static void main(String[] args) {
		Thread t1=new Thread(new TestRunnable());
		t1.start();
	}
生成的class中,我们可以看到是这样的
invokevirtual
return


Runnable是独立任务,没有任何返回值,如果希望得到返回值,可以使用callable接口.但是这个必须使用executorService的submit来调用..
public class TestCallable implements Callable<String> {

	public String call() throws Exception {
		Thread.sleep(50);
		return Thread.currentThread().getName();
	}

}

public static void main(String[] args) {
		ExecutorService executorService= Executors.newCachedThreadPool();
		List<Future<String>> results=new ArrayList<Future<String>>();
		for(int i=0;i<10;i++){
			results.add(executorService.submit(new TestCallable()));
		}
		for(Future<String> s:results){
			try {
				System.out.println(s.get());
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			}
		}
	}


在使用future的get方法时如果线程还没有执行完成会阻塞知道结果返回.可以用isDone来查看是否完成.

另外实现线程的方法,直接继承Thread写run方法,然后调用start..Thread的start方法是直接调用run方法的.

2.线程的风险.
使用线程的风险如同他的好处一样不少..=.=真是个双刃剑哈.
首要的风险,就是大家都知道的安全危险.
比如一个方法
public class GetSequence {
	private int value;
	public int getValue(){
		return value++;
	}
}

在多线程执行的时候可能会出现调用方法得到的值是一样的情况..

这个时候就会得到相同的值..当然,因为存在重排序的可能,也许情况会更烂哈.
这种危险就是竞争条件.因为线程间共享相同的内存地址空间,而且并发运行,他们就有可能访问或者修改其他线程正在使用或者修改的变量..
为了预防这种风险,就需要同步机制来协调访问..
比如,加上一个synchronized关键字.
public class GetSequence {
	private int value;
	public synchronized int getValue(){
		return value++;
	}
}


还有一种危险就是活跃度危险.当一个活动进入到一种他永远无法继续执行的时候,就发生了活跃度失败.
主要有我们常听说的,死锁,还有活锁,饥饿.
多线程可以给我们带来一些性能上的好处,也同样可以带来一些性能上的危险..比如上下文切换时,频繁切换会给系统带来巨大的开销..比如保存,回复线程的上下文,cpu也会花费在线程的调度上等等性能开销..

又写了一些,地址见上面哈
分享到:
评论
10 楼 lzj0470 2010-05-18  
应该是发布的时间
9 楼 mathfox 2010-05-17  
写的什么啊,这也上主页。

请问管理员,主页文章是按什么排出来的啊,活跃度?
8 楼 reilost 2010-05-17  
whg333 写道

LZ是看《Java并发编程实践》做的总结吧?


嗯,对哈,头段时间做的东西涉及很多并发,所以突击看了好多本书,写这个总结的时候,就用了那里提的那个例子..

另外,不能运行....额.....这....我菜鸟,不懂不能运行是指什么...求详解.
7 楼 sarstime 2010-05-17  
linvar 写道
reilost 写道

比如一个方法
public class GetSequence {
	private int value;
	public int getValue(){
		return value++;
	}
}

在多线程执行的时候可能会出现调用方法得到的值是一样的情况..

调用方法得到的值一样有什么错.你是在两个线程new GetSequence,然后getValue()的吧
如果是这样两个对象的地址都不一样,根本不会发生冲突


同意,这个例子是有问题的,加上sync 的关键字也不会work,楼主test过么?;)
6 楼 whg333 2010-05-17  
linvar 写道
reilost 写道

比如一个方法
public class GetSequence {
	private int value;
	public int getValue(){
		return value++;
	}
}

在多线程执行的时候可能会出现调用方法得到的值是一样的情况..

调用方法得到的值一样有什么错.你是在两个线程new GetSequence,然后getValue()的吧
如果是这样两个对象的地址都不一样,根本不会发生冲突


调用方法得到的值一样有什么错?这里LZ其实应该有个前提条件,在用GetSequence类获得唯一序号或者记录次数的时候,返回得到的值一样就不对了...
LZ是看《Java并发编程实践》做的总结吧?
5 楼 linvar 2010-05-17  
reilost 写道

比如一个方法
public class GetSequence {
	private int value;
	public int getValue(){
		return value++;
	}
}

在多线程执行的时候可能会出现调用方法得到的值是一样的情况..

调用方法得到的值一样有什么错.你是在两个线程new GetSequence,然后getValue()的吧
如果是这样两个对象的地址都不一样,根本不会发生冲突
4 楼 cc0128 2010-05-16  
原来很少看字节码,原来这样可以更加理解原理,学习了。
期待lz更新。
3 楼 czpsailer 2010-05-16  
坐等楼主更新
2 楼 玲cc 2010-05-16  
不错不错 起到楼主的更新
1 楼 xiaogu2008 2010-05-16  
期待楼主更新

相关推荐

    高并发总结

    《高并发总结》 在计算机领域,高并发是系统设计中的关键挑战,涉及到多个概念和技术。本文将深入探讨其中的一些核心知识点。 1. **同步与异步**:同步交互是发送请求后必须等待响应,而异步交互则无需等待,可以...

    Java并发编程技术总结

    Java并发编程技术总结,所含内容有并发特性、并发锁、线程池、并发场景解决方案等,对于性能思考和内容参考资料有一定说明

    java 并发学习总结

    本学习总结将深入探讨并发容器、同步容器、同步工具、死锁、异常处理、线程中断、线程池、返回结果以及同步方法等核心概念。 1. **并发容器**:Java提供了一系列的并发容器,如`ConcurrentHashMap`,它在并发环境下...

    高并发处理总结

    高并发处理总结

    最牛并发编程总结.png

    一共包括了java内存模型、并发基础、锁、并发工具类、java并发编程实战、优化、阻塞队列、原子操作、并发集合、线程池、线程基础、自定义并发类等13个方面的内容。 学习并发编程一张图就搞定了。

    阿里P8架构师谈:高并发架构解决方案总结

    高并发是指在同一个时间点,有很多用户同时访问URL地址,比如:淘宝的双11、双12,就会产生高并发。又如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击。服务端:导致站点服务器/DB服务器资源被占满崩溃,数据的...

    并发编程总结.xmind

    java并发编程总结,包括多线程安全机制分析总结,Unsafe源码分析总结,并发工具类总结,ThreadLocal原理和使用,Fork/Join框架使用总结,同步容器和并发容器源码分析

    Java 多线程与并发编程总结.doc

    Java定义了10个线程优先级,从`Thread.MIN_PRIORITY`(1)到`Thread.MAX_PRIORITY`(10),默认优先级是`Thread.NORM_PRIORITY`(5)。不过,线程优先级并不保证绝对的执行顺序,具体调度仍由JVM决定。守护线程(daemon ...

    提高系统并发方法总结

    ### 提高系统并发方法总结:深入解析 在现代信息技术领域,尤其是针对Web项目的开发与运维,提高系统的并发处理能力成为了确保用户体验与系统稳定性的重要因素。本文将深入探讨四种有效提升Web项目并发性的策略:...

    Java并发理论知识框架总结

    本知识框架是对《Java并发编程实战》一书的总结,主要围绕基本线程和线程池的使用、线程使用中出现的三大问题以及如何解决这些问题出发总结出了这个知识框架,通过该框架能更加深入的去理解Java并发理论知识。

    CsGo并发流程控制框架

    八、总结 CsGo并发流程控制框架结合了C#语言的特性和.NET Framework的强大支持,为开发者提供了丰富的工具和策略来应对高并发环境的挑战。通过对`ConsoleTest`项目的分析,我们可以更好地理解如何在实际开发中应用...

    高并发web架构完整1

    总结,这份《高并发Web架构完整1》资料全面地介绍了从理论到实践,从基础架构到高级策略,用于构建高性能Web站点的各个方面。对于希望提升Web应用性能、应对高并发挑战的开发者来说,这是一个宝贵的资源库。

    Java并发专题面试总结复习总结题集

    Java并发专题面试总结复习总结题集

    优化nginx大并发——轻松应对上万并发访问

    总结来说,优化Nginx以应对大并发访问,不仅需要对系统参数进行调整,还要对Nginx的配置进行精细控制,通过合理的进程管理、网络连接处理和资源分配策略,实现高效且稳定的高并发服务。同时,持续的压力测试和性能...

    java并发编程与高并发处理.xmind

    java并发编程总结,为xmind格式,总结的很详细,包含常见的并发容器,锁等知识

    基于并发服务器几种实现方法(总结)

    ### 基于并发服务器几种实现方法(总结) 在现代互联网技术中,为了处理大量并发请求,提升服务器响应效率及稳定性,开发人员通常会采用多种技术手段实现并发服务器。本文将详细探讨几种常见的并发服务器实现方法,...

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...

Global site tag (gtag.js) - Google Analytics