1.wait/notify是Object提供的native方法,可以用来线程之间的通信。
wait/notify结合synchronized可以实现一个线程安全的消息队列。
2、BlockingQueuee
BlockingQueue是JDK提供的线程安全的消息队列,对增加、删除、获取提供了四种的操作:
1、阻塞(put、take)
2、抛异常(add,remove)
3、阻塞等待超时(offer,poll)
4、返回特殊值(offer,poll)
BlockingQueue是个接口,JDK也提供了相应的实现,实现中主要使用Lock和Condition,Condition有await和signal方法,类似wait和notify方法。
想要了解Lock的机制或者自己要实现一个锁,就得了解
AQS(AbstractQueuedSynchronizer)是什么了,Lock的具体实现
ReentrantLock,ReadLock, WriteLock都是基于
AQS实现的,这里暂时不说AQS了,说下 BlockingQueue具体的几个实现:
1、ArrayBlockingQueue:有界队列,底层是数组
2、LinkedBlockingQueue:无界队列,底层是个单向链表
3、 SynchronousQueue:同步队列,不提供任何容器来存放数据
4、PriorityBlockingQueue:优先级无界队列,底层是二叉树最小堆
5、DelayQueue:支持延时获取元素的无界阻塞队列。底层是使用 PriorityQueue来实现。
所以,wait/notify和BlockingQueue都可以实现消息队列,解决生产者和消费者的问题。不过BlockingQueue的实现提供更多的功能。
希望对你有帮助,可以关注下我,后续会分享更多架构和Java知识,谢谢。
经过20多年的发展Java从最初嵌入在网页中的Applet发展到几乎各个开发领域,包括Web解决方案、大数据、人工智能、移动互联网、物联网、云计算等等。所以目前Java成为了程序员必须掌握的开发语言之一,相信在未来很长一段时间内,Java依然会是一门被广泛使用的开发语言。
那么Java到底包括哪些内容呢?答案首先要到Java的官方资料中查找。
这是Java官方给出的Java技术提纲,下面对这里面的技术进行分别解读:
Java SE
这是很多初学者最初学习Java就接触的内容,简单的说就是Java的标准版,也是很多其他版本的母版(基础版),Java SE是学习Java技术的第一步,目前已经更新到Java 10版本。
这一部分从创建一个基本的Java类开始,描述Java面向对象编程的核心概念以及编程过程:类的设计、对象的创建、方法的调用。细节包括类、对象、属性、方法、封装、继承、多态、异常、集合、线程等,也包括一些诸如java.time包中的类如何使用,以及如何部署Java程序。
这一部分主要讲解如何使用Swing和JavaFX,这两个技术是目前使用Java做图形用户界面的主要解决方案。JavaFX出现的时间较晚,很多使用JavaFX的程序员对这个技术的评价还是非常不错的,随着版本的更新,相信JavaFX将会得到更好的发展(我之前的文章中有针对JavaFX的详细介绍)。Swing是在AWT基础上开发的轻量级GUI解决方案,图形组件采用了MVC结构,操作简单且功能强大,唯一的遗憾是速度偏慢。
这部分涵盖了JavaSE中的诸多细节,包括网络编程、平台适配、JavaBeans、JDBC、JMX、JNDI、JAXP、JAXB、RMI、反射、安全、多媒体等内容。这里面每一个内容都需要写上一本书才能完全讲解清楚,包含的细节也非常多,这里面的RMI是Java分布式编程的基础(我之前的文章中有关于RMI编程的细节描述),JDBC则是如何通过Java操作数据库的API等等。
这里面涵盖的技术在我之前的头条文章中都几乎有所涉及,感兴趣的朋友可以关注一下。
Java EE
Java EE此前一直是官方主推的企业级Java解决方案,里面涵盖了大量企业级开发的API,目前Oracle公司已经把Java EE交给Eclipse基金会来管理了,已经改名为Jakarta EE了,也许未来EE版会带来更多改变。虽然已经脱离了官方阵营,今天也简单描述一下Java EE版都包含了哪些内容。
Java EE版本涵盖的主要内容是围绕EJB展开的,Java官方为企业级开发提供了三种EJB方案,分别是会话Bean、实体Bean和消息驱动Bean。
围绕这三种EJB企业可以开发出大用户并发的安全的Java分布式平台,当然性能以及事务处理等方面的优点是显而易见的。
虽然Java官方为EJB付出了巨大的代价(人力、物力),但是市场对EJB并不是全盘接受,因为EJB太重了。Spring的出现使得EJB的地位非常尴尬,后来EJB的版本更新也借鉴了Spring的很多理念,但是EJB的基因太难改变了。
Java ME
ME版本的出现时间并不晚,我在2004年的时候曾经短暂的使用过ME版本在Nokia的塞班平台下进行程序开发。可以说当年的Sun公司对嵌入式设备的发展还是具备一定眼光的,只是当IOS和Android平台出现的时候,Java ME多少显得有些尴尬。
Java ME针对嵌入式设备进行了重写,支持在嵌入式设备上运行Java应用。当年也确实有很多基于Java ME开发的嵌入式产品,大到美国发射的“勇气号”太空车,小到工业机器人,目前Java ME的应用并不多,但是官方依然对Java ME抱有期望。
Java Card、Java TV、Java DB
关于Java Card可能用过的人就更少了,但是在最初推出这个技术的时候,Java Card为我们描绘了很多未来的应用场景(目前这些场景中的很多内容由智能手机完成了)。看一下Java Card的官方定义:
可以说Java Card在一些具体场景中还是有所应用的,比如通信领域和金融领域等对安全性有较高要求的领域。
看一下Java TV的官方定义:
Java TV的出现是数字化TV发展的必然结果,同样,目前这部分市场被Android抢占的比较厉害,好在Android的应用开发也采用了Java语言。
看一下关于Java DB的官方描述:
Java DB是Java数据库应用的一个方向,能在数据库平台上提供完全的Java支持。
以上就是Java包含的技术总结,当然,现在的Java已经不仅仅是Oracle公司的,全世界很多科技公司或组织都在开发基于Java的各种应用,所以Java已经不单纯的是一门语言,更是一个平台、桥梁和链条。
我在头条上写了关于Java技术的系列文章,感兴趣的朋友可以关注一下,有问题可以一起交流。
自学java?
现有兴趣学习一下java,各路大仙给点建议和指导。感谢各位不吝赐教
“这是一篇完整的java程序员学习线路图,一共分为六个阶段。
我以java为例,展示完整的学习步骤。
希望对于想通过java自学的朋友有帮助。
java程序员学习线路流程
第一步:Java语言基础
从最简单的开始,hello world开始Java之旅
1.编程基础
-
常量与变量
-
数据类型
-
运算符
-
流程控制语句
-
方法
-
数组
2.面向对象
-
面向对象思想
-
类与对象
-
成员变量和局部变量
-
封装
-
this关键字
-
构造方法
3.集合
-
集合概述
-
集合特点
-
ArrayList集合
-
HashMap集合
-
常用集合优劣比较
4.输入/输出 IO
-
字符输入流
-
字符输出流
-
字符缓冲输入流
-
字符缓冲输出流
-
复制文件
-
集合与文件中数据相互读写
5.练习阶段
属于你自己的helloword
第二步:java语言高级
再结合java高级部分,里面的部分内容,这个阶段你不一定能理解很彻底。但有一点,如果你今后想进入高阶俱乐部,这些内容你必须掌握牢固。
举个栗子,如果你面试通过进入了公司,我一定会在早期仔细review你的代码。代码的功力是欺骗不了人的,不同人写一个接口,呈现的结果也是千差万别(所以才有了规范)。
1.面向对象
-
继承
-
多态
-
重写(Override)
-
重载(Overload)
-
封装
-
接口
-
java包 package
2.异常处理
-
异常概述
-
异常分类
-
异常处理方案
-
自定义异常
3.多线程
-
Java线程:概念与原理
-
Java线程:创建与启动
-
Java线程:多线程的实现方案
-
Java线程:线程生命周期
-
Java线程:线程池
-
Java线程:线程状态的转换
-
Java线程:线程的同步与锁
-
Java线程:线程的交互等等
线程的几个主要概念
在多线程编程时,你需要了解以下几个概念
-
线程同步
-
线程间通信
-
线程死锁
-
线程控制:挂起、停止和恢复
4.输入与输出IO
-
文件和I/O
-
读写文件
-
Java 流(Stream)
-
文件(File)
-
缓冲流
5.泛型(Generic )
-
泛型的使用场景
-
泛型类型
-
泛型方法
-
泛型通配符?
6.网络编程
-
网络机制
-
Socket原理机制
-
UDP、TCP传输等
7.反射(reflection)
-
类加载机制原理
-
反射构造方法、字段、方法
-
Properties配置文件
8.注解(annotation)
-
注解的使用和原理
-
三种内置annotation
-
自定义annotation
-
注解类的反射调用
-
动态代理类如何处理
9.Java高级特性和类库
-
java类加载器class loader
-
java 程序运行的基础知识,java编译后的bytecode的整个运行机制,这一点对应.net的IL(intermediate language)。
-
理解Java nio,关于这一点网上有非常多的教程,这一条需要重点掌握,对于高并发的掌握很重要。
-
java juc(java.util.concurrent)等等
10.JVM原理和调优
JVM最重要的三个部分必须要非常清楚,内存划分、class加载机制以及GC策略。搞清楚这三部分不仅仅是为了面试,也是为了让你对于Java有更深刻的理解,这对于你的Java生涯非常有帮助。
内存划分简单说分为三个部分,Young Generation(年轻代)、Old Generation(年老代)以及Perm Generation(永久代)。其中的Young Generation(年轻代),又分为Eden、From和To,其中From和To又统称为Survivor Spaces(幸存区)。
关于classloader机制的学习,可以结合tomcat去学习,了解清楚tomcat的classloader机制,看tomcat是如何保证各个APP之间的类隔离的。如果可能的话,看一下tomcat中classloader的源码,当中也包含了与tomcat类加载机制相似的部分。
至于GC,需要清楚GC Roots都有哪些,以及如何判断一个对象可以被回收。此外,GC的算法和策略也要有大概的了解。
第三步:java web阶段
1.前段技术掌握
-
html
-
css
-
js
-
jquery
-
bootstrap
2.动态网页技术
-
Java Servlet API
-
Velocity
-
FreeMarker
-
JSP等常用模板引擎
比如,淘宝前端层使用的是velocity模板,部分公司采用jsp、freemarker等,基本类似。
3.linux服务器基本命令
在个阶段,也可以结合自己的情况,学习linux系统底层原理。
第四步:java框架阶段
1.SSH(struts2+spring+hibernate)
2.SSM(springmvc+spring+mybatis)
备注:如果你仔细,网上有部分叫SSI,I为ibatis,后来ibatis改名为mybatis了。
框架组合,我首推SSM,比SSH灵活强大。
框架的优缺点,我会再单独写文。
如果你还有兴趣,可以自己搭建Lucene、solr框架,以及memcached/ redis、activeMQ、hadoop等等搜索、分布式缓存、异步消息、数据等。
我一般建议自己搭建,从学习效果再到理解深度都不一样。有兴趣,就开始自己搭建。
第五步:开发工具阶段
1.web调试工具
-
firefox
-
firebug
-
web developer
-
yslow
-
httpwatch
-
ietester等
这些都是开发必用。
2.集成开发工具
eclipse(首推) ,STS,myEclipse,Idea
eclipse里的插件太多,推荐几个必装插件:
JadClipse 、run-jetty-run(很牛的热部署调试)、veloctiy、freemarker IDE、Subclipse、m2eclipse、mybatis Editor、 Easy Explorer等等。
3.版本控制工具
svn、git(首推)
4.构建工具
maven、nexus搭建maven私服
建议自己搭建一套nexus maven私服,成为你们公司的代码仓库员。
5.java调试工具
-
jProfiler(性能跟踪)
-
jClarity(性能监控和日志分析)
-
Visualvm(性能分析和调优)等
优知学院是IT人的进阶站,提供系统的互联网产品&技术的入门指南以及进阶干货。
怎样学习Java?
作为一名计算机专业的教育工作者,同时也出版过Java编程书籍,所以我来回答一下这个问题。
首先,从编程语言自身的难易程度上来说,Java语言还是具有一定学习难度的,原因有三方面,其一是Java语言的抽象程度比较高;其二是Java语言的语法规则相对严谨;其三是Java语言比较依赖于框架和模式。
对于初学者来说,学习Java语言首先要从理解Java语言的各种抽象开始,其中类和对象是首先应该掌握的概念,掌握了类和对象之后,再理解封装、继承和多态这些概念的时候会更容易一些。理解抽象本身具有一定的难度,对于没有编程语言基础的人来说更是如此,而要想更好地了解这些抽象,应该通过各种实验来建立画面感。按照历史经验来看,Java语言的初期学习难度是比较大的,后期的学习难度相对会比较低。所以学习Java编程,一定要坚持。
Java语言本身是纯粹的面向对象编程语言,而且语法规则比较严谨,这样做的好处是保证了java语言的运行效率和程序可读性(规范性),但是坏处是初学者需要记住很多规则,只有多用才能逐渐熟悉这些规则。为了提高初学者编写代码的规范性,java初学者还需要学习一系列编程模式,所以在掌握了基本的Java语法之后,紧接着就需要学习一系列Java模式。
学习Java语言还需要学习一系列开发框架,不同的开发框架有不同的应用场景,会解决不同的问题,目前应该重点学习一下Spring框架,经过多年的发展,目前Spring系列框架已经比较成熟了,可以说为开发者提供了“一站式解决方案”。
最后,学习java一定要注重实践,所以在学习完基本的java框架之后,最好在实习岗位上锻炼一下。
我从事互联网行业多年,目前也在带计算机专业的研究生,主要的研究方向集中在大数据和人工智能领域,我会陆续写一些关于互联网技术方面的文章,感兴趣的朋友可以关注我,相信一定会有所收获。
如果有互联网、大数据、人工智能等方面的问题,或者是考研方面的问题,都可以在评论区留言,或者私信我!
JAVA是什么?Java工程师到底是做什么的?
Java是一种高级计算机语言,它是由SUN公司(已被Oracle 公司收购)与1995年5月推出的一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java语言简单易用、安全可靠,主要面向Internet编程,具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
为了使软件开发人员、服务提供商和设备生产商可以针对特定的市场进行开发,SUN公司将Java划分为三个技术平台:Java SE(J2SE,Java2 Platform Standard Edition,标准版);JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企业版);Java ME(J2ME,Java 2 Platform Micro Edition,小型版)。Java语言的特点主要有以下几个:简单、面向对象、安全、跨平台、支持多线程。
Java软件工程师是指运用Java这个开发工具去完成软件产品的软件程序设计、开发、测试、维护升级等工作的人员。Java工程师的工作内容主要包括完成软件的设计、开发、测试、修改bug等工作,包括业务需求的沟通,功能模块详细设计,业务功能实现与单元测试,系统维护;参与产品构思和架构设计;撰写相关的技术文档;支持售前技术服务;支持项目对产品的应用服务等。 一个合格的Java工程师要求有一定的软件分析设计能力;熟悉Java、Servlet、JSP、EJB等开发技术;熟练使用Eclipse或jbuilder等java开发工具;熟悉JAVA+STRUTS体系结构和开发工具;熟悉至少一种数据库的开发和设计;具有良好的学习能力,具有强烈的工作责任心、有良好的沟通能力和团队合作精神。