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

java 线程个人总结

阅读更多
关于原子
嗯,为什么要加锁?相信有点基础的童鞋都很清楚。在多线程情况下调用方法主要会出现两类问题 --原子性和非原子性!那他们各自会在神马情况下出现捏?

举一个《thinking in java》第四版中的例子。有一个EvenGenerator类,它的next()方法用来生成偶数。如下:
public class EvenGenerator {
 
	private int currentValue = 0;
	private boolean cancled = false;
 
	public int next() {
		++currentValue;       //危险!
		++currentValue;
		return currentValue;
	}
 
	public boolean isCancled() {
		return cancled;
	}
	public void cancle() {
		cancled = true;
	}
}


另外有一个EvenChecker类,用来不断地检验EvenGenerator的next()方法产生的是不是一个偶数,它实现了Runnable接口。

public class EvenChecker implements Runnable {
 
	private EvenGenerator generator;
 
	public EvenChecker(EvenGenerator generator) {
		this.generator = generator;
	}
 
	@Override
	public void run() {
		int nextValue;
		while(!generator.isCancled()) {
			nextValue = generator.next();
			if(nextValue % 2 != 0) {
				System.out.println(nextValue + "不是一个偶数!");
				generator.cancle();
			}
		}
	}
}


然后创建两个EvenChecker来并发地对同一个EvenGenerator对象产生的数字进行检验。

public class Test {
 
	public static void main(String[] args) {
		EvenGenerator generator = new EvenGenerator();
		Thread t1 = new Thread(new EvenChecker(generator));
		Thread t2 = new Thread(new EvenChecker(generator));
 
		t1.start();
		t2.start();
	}
}


显然,在一般情况下,EvenGenerator的next()方法产生的数字肯定是一个偶数,因为在方法体里进行两次”++currentValue”的操作。但是运行这个程序,输出的结果竟然像下面这样(并不是每次都是这个一样的结果,但是程序总会因这样的情况而终止):

849701不是一个偶数!


错误出在哪里呢?程序中有“危险”注释的哪一行便可能引发潜在的错误。因为很可能某个线程在执行完这一行只进行了一次递增之后,CPU时间片被另外一个线程夺去,于是就生产出了奇数。

原子性(atomicity)
具有原子性的操作被称为原子操作。原子操作在操作完毕之前不会线程调度器中断。在Java中,对除了long和double之外的基本类型的简单操作都具有原子性。简单操作就是赋值或者return。比如”a = 1;”和 “return a;”这样的操作都具有原子性。但是在Java中,上面例子中的类似”++currentValue;”这样的操作不具有原子性,所以如果add方法不是同步的就会出现难以预料的结果。在某些JVM中”++currentValue;”可能要经过这样四个步骤:
1.从内存得到currentValue的值
2.第一次+currentValue
3.第二次+currentValue
4.把currentValue写回内存
上面会出现奇数的情况就是第一次+currentValue完成的时候,还没来得及往内存中写数据。CPU的时间片被另一个线程占用,当那个线程使用完CPU切换回来的时候再来运行+currentValue,就会出现奇数了!

解决以上问题的方法无疑就是同步

关于synchronized
1.方法上加synchronized 是给整个类加锁。synchronized(Object){}是给object对象加锁。相对而言各有各的用处,但是,不到迫不得已坚决不用synchronized加锁!

步的代价:首先,同步化的方法有些额外的成本。进入同步化方法的程序会查询锁等性能上的损耗。其次,同步化方法会强制线程队列排队等着执行方法。最后,同步化很可能会导致死锁!!!!!!!!!!!!!!!!!!

同步的死锁
在java中,死锁是一件很恐怖的事情!因为java根本没有处理死锁的机制,他甚至不会知道死锁的发生!

下面来看一下可以如何导致死锁
head firs java 中的说法

两个线程和两个对象
线程A foo
线程B bar
1.线程A进入对foo对象设定同步化的方法
2.线程B进入对bar对象设定同步化的方法,线程B接着尝试要进入A正在执行的方法。所以B一直等着。
3.线程A醒来尝试调用线程B正在执行的方法,但拿不到钥匙,所以只好等着
A一直等着B的bar钥匙,B却也在等着A的foo钥匙。两个线程就这样僵持着!
0
1
分享到:
评论

相关推荐

    个人总结40个Java多线程面试问题和答案

    个人总结40个Java多线程面试问题和答案,很全面,让你不再担心多线程的面试问题。

    java多线程设计模式详解(PDF及源码)

    书中包含Java线程的介绍导读、12个重要的线程设计模式和全书总结以及丰富的附录内容。第一章相关线程设计模式的介绍,都举一反三使读者学习更有效。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的...

    Java基础多线程.xmind

    个人关于java基础多线程的思维导图总结。0积分下载。如果认为有帮助,请关注点赞,日后还有更多免费资源。

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    java线程的基本知识

    个人总结,一些java线程的基本心得,特别适合初学小白,希望可以有帮助

    java基础学习总结笔记

    ) 本文档是基于毕向东老师的java基础视频和张孝祥老师的高薪技术视频和银行管理系统以及交通灯管理系统的视频所做的笔记。...(此文档全手打,个人总结也许有不到位或者失误的地方,欢迎您指正。非常感谢~)

    java多线程设计模式 (PDF中文版, 附源码)

    目录: 漫谈UML Introduction 1 Java语言的线程 Introduction 2 多线程程序的评量标准 第1章 Single Threaded Execution——能通过这座桥的,只有一...附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献

    Java多线程简单Demo

    个人的小总结,适合初学者,包含了java多线程的基本概念,再配上简单的demo,相信初学者学习完对多线程能有较清晰的认识

    个人总结的Java算法和实战demo.zip

    多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...

    java自定义线程模型处理方法分享

    本文给大家总结分享了下个人关于java处理自定义线程模型的一些经验和处理方法,有需要的小伙伴可以参考下

    java summary(java笔记)

    学习java的一些笔记和个人总结 9、Collection 和 Collections的区别。  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.。Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种...

    桌面弹球游戏代码以及个人总结

    这是我自己写的总结,不是很好,但还凑合,希望对大家有帮助

    Java开发及面试(个人面试、工作总结、资料收集站).zip

    本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用,都做了深入的探讨和总结。具体内容包括: Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心...

    2021 - JAVA秋招基础知识点面试题

    本人2021年JAVA秋招基础知识点面试题个人总结,包括JAVA基础、JAVA容器、JAVA多线程、JVM等,涵盖大中厂面试题,答案仅供参考。

    Java面试题和答案总结(10万字)

    这资源是一个全面总结的Java面试题和答案集合,包含了基础篇、JVM、多线程&并发、Spring、MyBatis、SpringBoot、MySQL、SpringCloud、Dubbo、Nginx、MQ、数据结构与算法、Linux、Zookeeper、Redis、分布式、网络、...

    2019java亲生经历面试题答案解析准备.zip

    主要是这些,本来我是不想赚积分的,可是我上传也不能设置积分,不然我就设置成免费的,个人工作经验俩年,毕业三年。是故找工作需要做一些准备工作,把我锁找到的资料给大家分享一下,希望有一些助益。内容主要有...

    Java面试文档压缩包

    Java核心知识点总结:这些文档整理了Java编程语言的核心概念和重要知识点,如面向对象编程、异常处理、输入输出、反射等。通过学习这些知识点,您可以加深对Java语言的理解,为面试时的技术问题做好准备。 面试经验...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。  《java jdk 7学习笔记》针对java se 7新功能全面改版,无论是...

    java 精美 多人聊天系统

    6、该应用对于想要总结JavaSe基础的同学,或者想要尝试JAVA Swing的同学,亦或想要参考制作项目的同学都有所帮助。 效果展示图和更多小技巧尽在:http://blog.csdn.net/ahmclishihao/article/details/52732698

    java收银系统源码-Java-Interview:Java面试学习材料,架构资料,面试题总结:hot_beverage:

    Java多线程 JVM虚拟机 Spring系列(SpringIOC、SpringAOP、SpringMVC及SpringBoot) ORM(Mybatis) 数据库(Mysql和Redis) 微服务(Dubbo) 消息队列(RocketMQ) 计算机网络 操作系统(Linux系统) 微服务项目(SpringBoot+...

Global site tag (gtag.js) - Google Analytics