barriers / 阅读 / 详情

主线程等待子线程结果过程中,如何即处于等

2023-07-15 12:36:56
共1条回复
真可

主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。

这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。

应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示;

2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。

我试过网上的那个 CountDownLatch ,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的!

PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(int parties)

这个和countDownLatch就差不多了呢!

你觉得呢 问题补充:niuzai 写道亲,CyclicBarrier可能是你想要的。

PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看! 问题补充:niuzai 写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~ 嗯 我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵!

不过证明这个方法是可以的! 问题补充:niuzai 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!

相关推荐

cyclicbarrier 怎么读

sai k li c bai ri er赛克利克百瑞尔
2023-07-15 07:39:141

战争机器4异步计算要开吗

要开。异步计算通过异步获取计算结果,也可以实现类似闭锁CountDownLatch、栅栏CyclicBarrier的功能。它使用Callable来代表一个任务,提交到Executor框架后,可以异步的通过Future来获取任务执行结果。可以通过CompletionService来提交一组任务到一个阻塞队列,再异步获取到这组任务的执行结果。
2023-07-15 07:39:311

java的多线程不异步怎么办

可使用同步组件CountDownLatch、CyclicBarrier等使异程同步。Java异步会导致代码出现诸多不可控因素,这时可可使用同步组件CountDownLatch、CyclicBarrier等进行修复。多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制。
2023-07-15 07:39:391

java中怎样实现多线程执行的结果相加

定义一个成员变量,在线程里加到成员变量里就好了。
2023-07-15 07:39:482

分库的数据用java怎么并行查询

一般涉及分表,不会按照编号来分,对于不同的业务场景,有些仅仅是数据分析,可以按照时间或者其他进行水平分,如果是用户可能需要的数据,量大的话,会比如取用户IDhash来分,一般这种情况,不会查询多个用户数据参考http://tieba.baidu.com/p/2615753812
2023-07-15 07:39:572

我的百度面经(共8次面试)

百度智能云 数据库部门 一面: 1 数据库的事务,四个性质说一下,分别有什么用,怎么实现的。一致性没讲好。 2 讲到了redo和undo日志,问我分别有什么用,说redo日志说错了。 3 数据库的隔离性如何保证,使用悲观锁和乐观锁有何区别。MVCC的设计目的是什么,怎么使用版本号判断数据的可见性。 4 问了一道算法,1到N的所有数字,按照字典序打印,怎么做。 说了用数组排序,问复杂度,扯了半天。 怎么优化,按照数字特征顺序打印,问这个东西和什么结构比较像。提示是树,然后说了个多叉树,问我怎么实现,最后其实使用dfs遍历树的每个分支。 5 多线程并发的同步实现,有两个方法,每个方法里有a部分代码和b部分代码,我要让两个线程分别执行两个方法,并且让他们运行完a部分代码再一起向下执行,如何实现。 6 我说了用cyclicbarrier实现,互相等待await。 然后他问我怎么用信号量实现,并且提示可以再用一个线程。 然后我说了个方案。 7 问了项目 8 如何把优化递归的代码 改成尾递归或者循环。 面试官说不是,引导说用栈实现递归。 问我栈中需要压入哪些数据。他说应该是方法参数,返回值,以及返回地址。 二面: 1 自我介绍,项目 10分钟过去 2 服务器如何负载均衡,有哪些算法,哪个比较好,一致性哈希原理,怎么避免DDOS攻击请求打到少数机器。 3 TCP连接中的三次握手和四次挥手,四次挥手的最后一个ack的作用是什么,为什么要time wait,为什么是2msl。 4 数据库的备份和恢复怎么实现的,主从复制怎么做的,什么时候会出现数据不一致,如何解决。 5 今天面试太多了,记不清了。。。 6 开源的技术看过用过么,分布式存储的了解么。 7 想做什么方向的开发。 8 Linux查看cpu占用率高的进程 9 查看占用某端口的进程和某进程监听的端口 10 如何查询日志文件中的所有ip,正则表达式 三面(8.3号更新): 数据库部门真的很严格,问题都挺难的。 1 讲一下项目 2 平时了解什么操作系统 Linux,说一下Linux排查问题常用的命令,ps,top,netstat,free,du等等 3 Linux的内存管理算法,问了一下是不是页面置换算法,他说是。 说了lru和fifo,问我lru有什么缺点,没答上来。 4 Linux的文件系统了解么,讲了一下inode节点,文件和目录的原理。他问我了不了解具体的文件系统ext2,ext3,答不会。。 5 进程通信方式有哪些,问我分别怎么使用,管道有哪些类型,各有什么优缺点。 6 问我服务器硬件了解么。。一脸懵逼,问了我懂不懂Raid,瞎扯了几句就说不懂了。 7 shell了解么,没怎么写过。 8 听说你会Java,说一下JVM内存模型把,有哪些区,分别干什么的 9 说一下gc算法,分代回收说下。 10 设计模式了解么,说了7种,问我分别怎么用,实际应用过吗,稍微扯了一下。 11 MySQL的引擎讲一下,有什么区别,使用场景呢。 12 查询最新的10条数据,想了好一会,order by id desc limit 10 13 MySQL的union all和union有什么区别,我瞎掰了一下,应该不对。 14 MySQL有哪几种join方式,底层原理是什么,答不会,只知道表现形式。 15 Redis了解哪些啊,数据结构和基本原理把。 问我Redis怎么做集群,答了主从哨兵和cluster。 Redis的持久化怎么做,aof和rdb,有什么区别,有什么优缺点。 16 Redis使用哨兵部署会有什么问题,我说需要扩容的话还是得集群部署。 17 分布式系统了解么,说一下Hadoop了解啥。 我说基本组件稍微了解过,简单搭过环境。 18 MapReduce的combiner干啥的,我说是合并结果的,问我啥时候会用到,答不知道。 19 Hadoop分发任务时,有个job失败了,hadoop会怎么处理,我答不知道,猜是会继续执行。。 20 hadoop分发任务,如果有一个节点特别慢拉慢了整体速度怎么办。我猜测是通过yarn分配相同的资源给每个任务,可以避免这种情况,他好像不太满意。 21 hadoop答得很烂。问了我两个10g文件比较,2g内存,重复率很高,筛选出不同的内容。我说拆成十份hash,每份两两比较hash的结果集,貌似他说OK。 22 排序算法了解哪些,巴拉巴拉。 23 用队列计算一个树的高度,我说用层次遍历记录节点高度。 24 一个黑名单集合,数据量很大,快速查询一个值是否在集合里,怎么设计,我说布隆过滤器。 25 还是上一题,说这个黑名单可能需要动态地增删改,如何设计才能避免访问响应太慢。我没思路,瞎扯了一下加硬件,用内存存,都被驳回了。然后他说算了。 26 上一题的黑名单做成分布式,怎么做。说了分片的方案,根据地址的hash值确定分片所在节点。 27 分布式数据库了解么,我不太明白他问的是啥,说不了解,感觉应该是问数据库的分布式方案。 28 有什么想问的,据他所说还有2-3轮面试,惊了。 全程50分钟,可以说是迄今为止难度最大的一个? 百度智能云 账号和消息部门 一面: 1 项目 2 讲一下AOP吧 3 动态***和静态***有什么区别 4 TCP和IP报文是否会分片,分别在什么情况下会分片。 TCP分包之后是否还会进行ip分片 5 做个题 无限长轨道。两辆车同方向开,车会滴水,怎么让他们相遇。这题简直像脑筋急转弯。 6 写一个斐波那契数列 递归式,要求改进 dp方式,要求优化空间 用三个变量代替数组进行dp,要求改进 我说数学公式,OK。 7 讲一下Linux的内存结构,我说只会JVM的,他让我说一下。 两者的内存如何映射,是什么关系,不会。 8 没了 二面 : 1 项目讲一下,10多分钟去了。 2 排序算法,复杂度,比较。快排的空间复杂度是logn 3 讲一下OSI七层模型,我说了5层模型,然后他让我再补充一下,问了每层的作用,问了wifi属于哪一层。 4 线程间的同步用什么方式,说了object方法。 问我使用hashmap时重写哪两个方法,为什么要重写,巴拉巴拉,什么场景下重写。 5 平时用过什么数据结构,list用哪些有啥区别。 6 Spring中的ioc和aop。ioc的注解有哪些。 autowired和resource有什么区别,作用域有哪些。 autowired如何配置两个类中的一个吗 7 写一个单例模式,有点忘却了,巴拉巴拉搞出一个双重检测的,中间改了多次。 8 Java会有内存泄漏吗,三个区分别什么情况下会产生内存泄漏 百度智能云 好像是基础研发工程师的岗位 一面 1 项目 2 队列和栈区别 3 两个栈实现队列,两个栈实现最小值栈 4 数据库的事务性质,如何实现这些性质 5 事务隔离级别有哪些,默认是什么级别。 6 已提交读有什么问题,用于什么场景 7 二叉树了解么,平衡二叉树呢,有什么场景会用到呢。 8 僵尸进程和孤儿进程是什么,分别有什么危害。 9 主从复制怎么实现。 10 Redis你用来做什么,为什么不用mq做异步队列 11 分布式文件系统了解么,HDFS讲一下原理 12 Java中一般用什么类型表示价格。 13 Java如何把byte类型转换成字符串 14 Java的string类型为什么是不可变的 15 有什么问题 百度核心搜索 一面: 1 自我介绍 2 docker和k8s了解多少 3 研究生学了哪些课程 4 操作系统了解么,讲一下进程和线程 5 死锁和处理方式 6 内存,虚拟内存和页面置换 7 网络了解么,讲一下三次握手和四次挥手 8 数据库了解多少,mysql索引,事务,锁讲了一些 9 Redis呢,讲了一下数据结构,持久化方式,使用场景 10 分布式了解哪些,负载均衡有哪些方式,说了dns,nginx,lvs和硬件,一致性问题怎么解决,说了2pc,3pc,raft和paxos,zab 10 mysql大表数据查询,怎么优化,分表,分库。 11单链表判环 使用快慢指针解决 12 完全二叉树判断: 二面: 1 项目 2 docker和kubenetes的原理和了解程度 3 docker的cgroup了解么 4 kubenetes的架构,扩容是怎么完成的。 5 Java的四种引用 6 Java的线程通信方式 7 Linux的进程通信方式 8 Java的线程池 9 算法 1 - N + 1这些数中取出N个,问剩下的是哪个。。 我说加起来相减,面试官说取巧了,不能这样。 我说比较数组下标,他还是说取巧。 于是我让他提示我一下,他说了排序再找。。额 然后想了两个空间换时间的办法,一个是用hashmap遍历两个数组。一个是合并数组后统计数字出现次数,也是hashmap 10 给定一串数字,找出所有可能的IP地址组合,比如192168111,组合是192.168.1.11,192.168.11.1。 应该LeetCode的题。之前自己没写完整,现场憋出来了。 这个代码应该没错。面试官看了二十分钟才说ok。 然后我们就这样沉默了20分钟,中间他就说了几句话。 最后面试官说他们部门一共两轮面试。 咱们下期见!答案获取方式:已赞 已评 已关~ 原文出处:https://www.nowcoder.com/discuss/90112?type=post&order=jing&pos=&page=2&ncTraceId=&channel=-1&source_id=search_post_nctrack&gio_id=FD441016D0B12571A898266FE8D1C8C6-1657195040955
2023-07-15 07:40:171

有没有关于java深入一点的书推荐?

学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处:1.能出版出来的书一定是经过反复的思考、雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料。2.对着书上的代码自己敲的时候方便。“看完书之后再次提升自我的最好途径是看一些相关的好博文“,我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提炼,对于梳理学习的内容很有好处,当然这里不是说自己的学习方法,就不再扯下去了。很多程序员们往往有看书的冲动,但不知道看哪些书,下面我就给各位Java程序猿们推荐一些好书(每本书的作者会加粗标红),其中绝大多数都是我自己平时在看的书,也算是我对于平时读的书做一个小总结和读后感吧。首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life。目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客。这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是:随便开篇点明该设计模式的定义图文并茂讲解该设计模式中的结构以详细的代码形式写一下该种设计模式的实现补充内容讲解该设计模式的优缺点对于一个设计模式我们关注、学习的知识点,不就是上面这些吗?不过我要重点提醒一下网友们,同一种设计模式的写法有多种,并不是说只有按某种写法来写才是这种设计模式。比方说适配器模式,我们关注适配器模式一定要关注的是什么是适配器模式不是怎么写适配器模式,不要认为某段代码不是按照适配器模式的写法写下来的它就不是适配器模式了,记住这一点,你在学习设计模式的时候一定会对代码中用到的设计模式有更深入的理解。1、深入理解Java虚拟机:JVM高级特性与最佳实践如果你不满足于做一个只会写ifelse的Java程序员,而是希望更进一步,我随便举几个例子吧:了解Java代码的底层运行机制定位性能问题对整个系统进行性能调优解决各种奇奇怪怪的线上线下问题更加高级别的,为自己的项目量身定做一款适合自己项目的虚拟机那么Java虚拟机是你必学的一门技术。《深入理解Java虚拟机:JVM高级特性与最佳实践》作者是周志明,这本书可以说是国内写得最好的有关Java虚拟机的书籍,近半年,前前后后这本书我起码看了有5遍。国内写虚拟机的书除了这本,其实还有一些其他的,我也买过,不过粗略看下来,很多内容也是《深入理解Java虚拟机:JVM高级特性与最佳实践》此书里面的。另外值得一提的是,《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书,有电子版的,网上搜一下就能下载到了。不过建议有兴趣的朋友还是去买书看,电子版本下载到的一般是比较老的版本,相比最新修订版的《深入理解Java虚拟机:JVM高级特性与最佳实践》,有很多作者新补充的知识点是没有的。2、HotSpot实战所有的Java虚拟机都是遵循着Java虚拟机规范来的,市面上的Java虚拟机几十款,《深入理解Java虚拟机:JVM高级特性与最佳实践》一书里面讲的虚拟机并不针对某种特定的虚拟机,而是从Java虚拟机规范的角度来讲解Java虚拟机。我们平时使用的乃至商用的大多数Java虚拟机都是Sun公司的HotSpot,大家cmd进入命令行,使用”java-version”命令就可以看到了。如果希望在Java虚拟机规范的基础上更加深入地去理解虚拟机的一些细节是怎么实现的,就可以看一下《HotSpot实战》一书,作者是陈涛。不过由于HotSpot的源码都是C/C++写的,所以要求读者有非常好的C/C++基础,如果对这两门语言不是很熟悉的朋友,看这本书可能对你帮助不是很大。最后提一句,如果有兴趣的朋友,不妨先去网上下载一个openJDK,HotSpot的源码就在里面。3、Java并发编程实战这本书常常被列入Java程序员必读十大书籍排行榜前几位,不过个人不是很推荐这本书。《Java并发编程实战》作者是BrianGoetz,怎么说呢,这本书前前后后我也看了两遍左右,个人感受是:文字多代码少讲解多实践少我觉得这可能就是老外写书的特点吧,因为Java是北美国家(加拿大、美国)开发和维护的,所以老外对Java方方面面的理论知识体系都掌握得是非常清楚和透彻的。翻开这本书看,多线程什么用、什么是死锁、什么是竞争、什么是线程安全等等,方方面面的知识点都用大量的文字篇幅讲解,不免让人感觉十分枯燥,也难让读者有实质性的进步。我这本书看了两遍也属于一目十行意思,有兴趣的地方就重点看一下。无论如何,作为一本常常位于Jva程序员必读十大书籍排行榜前几名的书,还是一定要推荐给大家的。4、java多线程编程核心技术《Java多线程编程核心技术》作者高洪岩。想要学习多线程的朋友,这本书是我大力推荐的,我的个人博客里面二十多篇的多线程博文都是基于此书,并且在这本书的基础上进行提炼和总结而写出来的。此书和《Java并发编程实战》相反,这本书的特点是大篇幅的代码+小篇幅的精讲解,可能这和中国人写的书比较偏向实用主义的风格有关。本书关于线程安全、synchronized、Reentrant、Timer等等都用详细的代码进行了讲解,而且每个大知识点下的多个小知识点都会详细讲解到,非常有实践价值。有兴趣的朋友们,我相信只要你们跟着这本书里面的代码敲、运行、思考,三步走,对于多线程的使用与理解一定会进几大步。不过这本书的缺点就是对于Java并发包下的一些类像CountDownLatch、Semphore、CyclicBarrier、Future、Callable等都没有讲到,重点的CAS和AQS也没有触及,重点类的实现原理也没有提。当然,这很深入了,在学习了这本书之后如果能再去对这些知识进行一些学习、研究的话,你一定会慢慢成长为一个很厉害的多线程高手。5、EffectiveJava中文版这是唯一一本我没有买的书。初识这本书,是在我的博文Java代码优化(长期更新)里面,底下评论的时候有朋友提到了这本书,当时我说要去买,不过这两个月一直都没时间去逛书店,甚是遗憾,之后肯定会找时间去买这本书的。《EffectiveJava中文版》的作者是JoshuaBloch,这个人就很厉害了,他是谷歌的首席架构师,属于超级技术大牛级别了吧,呵呵。由于没有看过这本书,所以我不好发表评论,但是从这本书的知名度以及其作者的来头来看(多提一句,这本书也是Java之父JamesGosling博士推崇的一本书),我相信这一定是一本值得一看的好书。好的代码是每个Java程序员都应该去追求的,不是说我今天写一段好代码相比写一段烂代码对性能会有多大的提升,更多的应该是提升了代码的可读性以及可以规避许多潜在的、未知的问题,避免代码上线之后出问题而花时间去维护—-无论从时间成本、人力成本还是风险成本来说,这都是非常高的。6、深入分析JavaWeb技术内幕《深入分析JavaWeb技术内幕》,作者许令波,淘宝工程师。这本书我用一个字概括就是:全。真的非常全,HTTP、DNS、CDN、静态化、Jetty、Tomcat、Servlet、Spring、MyBatis等等,什么都有,涉及知识面非常广,但又不像专门精讲某个知识点的书籍一样讲得非常深入,感觉这本书就是尽量去用短的篇幅讲清楚一些JavaWeb使用到的技术的内幕,让读者对这些知识点的技术内幕有一个理性的认识。不过,尽管每个知识点的篇幅都不多,但是重点都基本讲到了,是一本让人真正有收获的书。如果想进一步了解这些技术的技术内幕,就要自己去买相关书籍或者自己上网查资料了,有种抛砖引玉,或者说师傅领进门、修行在个人的感觉。7、大型网站技术架构核心原理与案例分析一个字评价这本书,_;两个字评价这本书,很_;三个字评价这本书,非常_。呵呵,好了,再说下去可能别人以为我是水军了。《大型网站技术架构核心原理与案例分析》的作者是李智慧,原阿里巴巴技术专家。Java的大多数应用都是用在Web上的,现在只要稍微大型一点的Web应用,都一定是一个分布式系统,那么一个分布式系统用到了哪些技术?一个大型网站是如何从一个小型网站成长起来的?如何保证你的网站安全?分布式系统使用到了缓存,有哪些缓存?缓存的使用有哪些值得注意的事项?关于分布式的知识点,都在这本书里面有体现,只有你想不到,没有他写不到,而且写得非常易懂,基本属于看一两遍,再记一些笔记就知道是怎么一回事儿了。多看几遍,对分布式的理解一定会加深不少。而且里面不仅仅是分布式的知识,还非常接地气地写了如何做一个好的架构师,其实我认为这不仅仅是写给想做架构师的读者看的,就是给读者一些建议,如何更好地提出意见、如何更让别人关注你的声音、如何看到他人的优点,入木三分,让人获益匪浅。8、大型网站系统与Java中间件实践《大型网站系统与Java中间件实践》作者曾宪杰,是淘宝的技术总监,算起来应该在阿里有至少P8的级别了吧。这本书的部分内容和上面一本李智慧的《大型网站技术架构核心原理与案例分析》有所重合,像分布式系统的演化、CDN、CAP理论和BASE理论等等,这也更说明这些都是分布式系统或者说是一个大型网站重点关注的内容,当作一次再学习也不错。本书要突出的重点是中间件三个字,中间件是分布式系统中一个非常重要的东西,其最重要的作用应该就是解耦,降低模块与模块之间的强依赖,不同的模块之间的依赖度降低,便可以各自独立地开发自己的功能,这也可以说是软件工程发展的目标和驱动力。因此,本书有一部分的内容就是基于中间件,详细讲解了中间件与JMS的各种知识,适合对分布式系统比较熟悉并且想要往中间件方面有一定研究的读者。9、从Paxos到ZooKeeper分布式一致性原理与实践《从Paxos到ZooKeeper分布式一致性原理与实践》,作者倪超,阿里巴巴工程师。这本书是我最近在研读的一本书,和上面的《大型网站系统与Java中间件实践》一样,属于分布式组件的范畴,属于有些深入的内容,当然也是我自己的个人兴趣。当然,如果有志向做一个出色的大型网站架构师、公司的技术总监之类,这些知识当然是必须掌握的。本书从分布式系统基本理论开始讲起,讲到Paxos算法,最后慢慢引入到Zookeeper,循序渐进。当然,更多的我目前还不方便发表什么看法,因为这本书的第二张Paxos算法我都还没有弄懂(Paxos算法确实有些难以理解和不太易懂),接下来的章节还没有看下去。如果网友们所在的公司在使用Zookeeper,并且你又对Zookeeper感兴趣想要研究一下它的原理的,这本书将是不二之选。10、MySQL5.6从零开始学《MySQL5.6从零开始学》,作者刘增杰和李坤。作为一名Java程序员,我认为我们千万不要觉得数据库是DBA的事情,数据库对一个Java程序员来说也是必须掌握的一门知识,丰富的数据库性能优化经验是一个顶尖程序员必备技能。目前主流的数据库有Oracle和MySQL,当然推荐大家的是MySQL,主要原因我认为有两点:1、MySQL相比Oracle更轻量级、更小、安装和卸载更方便,SQL其实都是差不多的,如果想学数据库,学MySQL就可以了,在家里面可以自己方便地研究,如果你的公司使用Oracle,只要再用对比学习法,关注一下Oracle和MySQL的差别即可2、随着2009年阿里巴巴去IOE的运动的进行,目前国内的很多互联网公司都会选择MySQL作为它们使用的数据库,因为MySQL免费,所以既省钱又不需要出了问题就依赖甲骨文公司MySQL学习我推荐的是这本我自己学习看的《MySQL5.6从零开始学》,我是觉得挺好的这本书,书里面的知识点很细致、很全面,读者选择书籍的标准大多不就是这两点吗?11、Spring源码深度解析《Spring源码深度解析》,作者郝佳。Spring这个框架做得太好了,功能太强大了,以至于很多开发者都只知Spring,不知什么是工厂、什么是单例、什么是代理(我面试别人的真实体会)。这种功能强大的框架内部一定是很复杂的实现,这就导致一旦你的程序使用Spring,出了问题,可能是Error、可能是Exception、可能是程序运行结果不是你的预期的,出现诸如此类问题的时候,将会让你感到困惑,除了上网查资料或者问别人似乎没有更好的解决办法。研读Spring的源代码不失为一种很好的学习方法,我个人认为这有很多好处:理解框架内部的实现之后,可以主动去解决问题,而不需要依赖别人Spring框架内部实现用到了很多设计模式,很好的代码设计思路,这将会对你写代码、对你理解设计模式有很大的提高研究Spring框架将会大大增强你读代码的能力,我相信只要你能研究清楚Spring内部是如何实现的,其他任何一个框架的源代码都难不倒你总而言之,我认为读代码的能力是一个普通的程序员和一个好的程序员之间最大的差别之一,前者只会把别人写好的东西拿来用,后者不仅能用好,还清楚知道别人写好的东西底层是如何实现的,在出现问题的时候可以轻松解决。Spring源代码,个人推荐《Spring源码深度解析》一书,真要研究透并且写清楚Spring源代码,恐怕三四本书都不够,作者在近400页的篇幅中尽量去讲解Spring源代码是如何实现的,殊为不易,尽管无法讲得完全,但是相信作者的讲解配合上读者自己的研究,一定可以对Spring的实现有更深度的理解。以上就是我对Java高级部分应该看的书籍的推荐,希望可以对你有所帮助。说一点我的建议,我们学Java技术更重要的还是看视频教程,我们只有看更多的视频教程,不断的练习,在脑海当中产生深刻的记忆。我永远坚信我的一句话:书籍能诠释的东西毕竟有限。最后在这里推荐大家关注一下我的微信公众号:Java新手学习,给你准备了一套最新的Java基础精讲视频教程和Java系统学习路线,关注即可观看。
2023-07-15 07:40:351

一个程序会产生哪几个文件夹?

一个程序产生的文件夹如下:一、程序的组成部分Linux下程序大都是由以下几部分组成:二进制文件:也就是可以运行的程序文件库文件:就是通常我们见到的lib目录下的文件配置文件:帮助文档:通常是我们在Linux下用man命令查看的命令的文档二、Linux下程序的存放目录Linux程序的存放目录大致有三个地方:/etc, /bin, /sbin, /lib :系统启动就需要用到的程序,这些目录不能挂载额外的分区,必须在根文件系统的分区上/usr/bin,/usr/sbin,/usr/lib:操作系统核心功能,可以单独分区/usr/local/bin,/usr/local/sbin:/usr/local/lib:/usr/local/etc:/usr/local/man:这几个目录用于安装第三方程序,分别对应了二进制文件、库文件、配置文件、帮助文档的目录通常来说源码安装程序时,就安装在 /usr/local目录下原文地址:https://www.cnblogs.com/4545945a/p/11529744.html推荐文章ubuntu16.04环境下fatal error: lua.h: No such file or directoryDB2数据库建表报错MySQL、Oracle与DB2数据库差异jQueryrocketjQueryrocketjs文件替换PHP源文件编码与变量编码的判断PHP判断字符串所属编码:ASCII、GB2312、GBK、UTF-8、ISO-8859-1PHP的URL编码解码与原理、自定义实现Odoo13_前端图标按钮实例Odoo13_向导应用之软删除macOS一条命令查看当前wifi密码编译redis-5.0.8报错/usr/bin/ld: cannot find -latomic解决方法频繁调用ConcurrentLinkedQueue类的offer和remove方法会内存泄露记一次排查问题用到工具【jvisualvm】堆查器使用的内存不足开发规范各种http报错的报错的状态码的分析Springboot整合ElasticsearchWang u2764ufe0f Free Fast Stable Best Just try it_v2....md5表空间create_index非额度合同和额度合同如何在linux中查找python安装包的路径Golang中的SingleFlight与CyclicBarrierlinux安装protocprotobuf 的优缺点Xshell 连接 VirtualBox限制 input 输入框只能输入纯数字
2023-07-15 07:40:421

并发编程解惑之线程

主要内容: 进程是资源分配的最小单位,每个进程都有独立的代码和数据空间,一个进程包含 1 到 n 个线程。线程是 CPU 调度的最小单位,每个线程有独立的运行栈和程序计数器,线程切换开销小。 Java 程序总是从主类的 main 方法开始执行,main 方法就是 Java 程序默认的主线程,而在 main 方法中再创建的线程就是其他线程。在 Java 中,每次程序启动至少启动 2 个线程。一个是 main 线程,一个是垃圾收集线程。每次使用 Java 命令启动一个 Java 程序,就相当于启动一个 JVM 实例,而每个 JVM 实例就是在操作系统中启动的一个进程。 多线程可以通过继承或实现接口的方式创建。 Thread 类是 JDK 中定义的用于控制线程对象的类,该类中封装了线程执行体 run() 方法。需要强调的一点是,线程执行先后与创建顺序无关。 通过 Runnable 方式创建线程相比通过继承 Thread 类创建线程的优势是避免了单继承的局限性。若一个 boy 类继承了 person 类,boy 类就无法通过继承 Thread 类的方式来实现多线程。 使用 Runnable 接口创建线程的过程:先是创建对象实例 MyRunnable,然后将对象 My Runnable 作为 Thread 构造方法的入参,来构造出线程。对于 new Thread(Runnable target) 创建的使用同一入参目标对象的线程,可以共享该入参目标对象 MyRunnable 的成员变量和方法,但 run() 方法中的局部变量相互独立,互不干扰。 上面代码是 new 了三个不同的 My Runnable 对象,如果只想使用同一个对象,可以只 new 一个 MyRunnable 对象给三个 new Thread 使用。 实现 Runnable 接口比继承 Thread 类所具有的优势: 线程有新建、可运行、阻塞、等待、定时等待、死亡 6 种状态。一个具有生命的线程,总是处于这 6 种状态之一。 每个线程可以独立于其他线程运行,也可和其他线程协同运行。线程被创建后,调用 start() 方法启动线程,该线程便从新建态进入就绪状态。 NEW 状态(新建状态) 实例化一个线程之后,并且这个线程没有开始执行,这个时候的状态就是 NEW 状态: RUNNABLE 状态(就绪状态): 阻塞状态有 3 种: 如果一个线程调用了一个对象的 wait 方法, 那么这个线程就会处于等待状态(waiting 状态)直到另外一个线程调用这个对象的 notify 或者 notifyAll 方法后才会解除这个状态。 run() 里的代码执行完毕后,线程进入终结状态(TERMINATED 状态)。 线程状态有 6 种:新建、可运行、阻塞、等待、定时等待、死亡。 我们看下 join 方法的使用: 运行结果: 我们来看下 yield 方法的使用: 运行结果: 线程与线程之间是无法直接通信的,A 线程无法直接通知 B 线程,Java 中线程之间交换信息是通过共享的内存来实现的,控制共享资源的读写的访问,使得多个线程轮流执行对共享数据的操作,线程之间通信是通过对共享资源上锁或释放锁来实现的。线程排队轮流执行共享资源,这称为线程的同步。 Java 提供了很多同步操作(也就是线程间的通信方式),同步可使用 synchronized 关键字、Object 类的 wait/notifyAll 方法、ReentrantLock 锁、无锁同步 CAS 等方式来实现。 ReentrantLock 是 JDK 内置的一个锁对象,用于线程同步(线程通信),需要用户手动释放锁。 运行结果: 这表明同一时间段只能有 1 个线程执行 work 方法,因为 work 方法里的代码需要获取到锁才能执行,这就实现了多个线程间的通信,线程 0 获取锁,先执行,线程 1 等待,线程 0 释放锁,线程 1 继续执行。 synchronized 是一种语法级别的同步方式,称为内置锁。该锁会在代码执行完毕后由 JVM 释放。 输出结果跟 ReentrantLock 一样。 Java 中的 Object 类默认是所有类的父类,该类拥有 wait、 notify、notifyAll 方法,其他对象会自动继承 Object 类,可调用 Object 类的这些方法实现线程间的通信。 除了可以通过锁的方式来实现通信,还可通过无锁的方式来实现,无锁同 CAS(Compare-and-Swap,比较和交换)的实现,需要有 3 个操作数:内存地址 V,旧的预期值 A,即将要更新的目标值 B,当且仅当内存地址 V 的值与预期值 A 相等时,将内存地址 V 的值修改为目标值 B,否则就什么都不做。 我们通过计算器的案例来演示无锁同步 CAS 的实现方式,非线程安全的计数方式如下: 线程安全的计数方式如下: 运行结果: 线程安全累加的结果才是正确的,非线程安全会出现少计算值的情况。JDK 1.5 开始,并发包里提供了原子操作的类,AtomicBoolean 用原子方式更新的 boolean 值,AtomicInteger 用原子方式更新 int 值,AtomicLong 用原子方式更新 long 值。 AtomicInteger 和 AtomicLong 还提供了用原子方式将当前值自增 1 或自减 1 的方法,在多线程程序中,诸如 ++i 或 i++ 等运算不具有原子性,是不安全的线程操作之一。 通常我们使用 synchronized 将该操作变成一个原子操作,但 JVM 为此种操作提供了原子操作的同步类 Atomic,使用 AtomicInteger 做自增运算的性能是 ReentantLock 的好几倍。 上面我们都是使用底层的方式实现线程间的通信的,但在实际的开发中,我们应该尽量远离底层结构,使用封装好的 API,例如 J.U.C 包(java.util.concurrent,又称并发包)下的工具类 CountDownLath、CyclicBarrier、Semaphore,来实现线程通信,协调线程执行。 CountDownLatch 能够实现线程之间的等待,CountDownLatch 用于某一个线程等待若干个其他线程执行完任务之后,它才开始执行。 CountDownLatch 类只提供了一个构造器: CountDownLatch 类中常用的 3 个方法: 运行结果: CyclicBarrier 字面意思循环栅栏,通过它可以让一组线程等待至某个状态之后再全部同时执行。当所有等待线程都被释放以后,CyclicBarrier 可以被重复使用,所以有循环之意。 相比 CountDownLatch,CyclicBarrier 可以被循环使用,而且如果遇到线程中断等情况时,可以利用 reset() 方法,重置计数器,CyclicBarrier 会比 CountDownLatch 更加灵活。 CyclicBarrier 提供 2 个构造器: 上面的方法中,参数 parties 指让多少个线程或者任务等待至 barrier 状态;参数 barrierAction 为当这些线程都达到 barrier 状态时会执行的内容。 CyclicBarrier 中最重要的方法 await 方法,它有 2 个重载版本。下面方法用来挂起当前线程,直至所有线程都到达 barrier 状态再同时执行后续任务。 而下面的方法则是让这些线程等待至一定的时间,如果还有线程没有到达 barrier 状态就直接让到达 barrier 的线程执行任务。 运行结果: CyclicBarrier 用于一组线程互相等待至某个状态,然后这一组线程再同时执行,CountDownLatch 是不能重用的,而 CyclicBarrier 可以重用。 Semaphore 类是一个计数信号量,它可以设定一个阈值,多个线程竞争获取许可信号,执行完任务后归还,超过阈值后,线程申请许可信号时将会被阻塞。Semaphore 可以用来 构建对象池,资源池,比如数据库连接池。 假如在服务器上运行着若干个客户端请求的线程。这些线程需要连接到同一数据库,但任一时刻只能获得一定数目的数据库连接。要怎样才能够有效地将这些固定数目的数据库连接分配给大量的线程呢? 给方法加同步锁,保证同一时刻只能有一个线程去调用此方法,其他所有线程排队等待,但若有 10 个数据库连接,也只有一个能被使用,效率太低。另外一种方法,使用信号量,让信号量许可与数据库可用连接数为相同数量,10 个数据库连接都能被使用,大大提高性能。 上面三个工具类是 J.U.C 包的核心类,J.U.C 包的全景图就比较复杂了: J.U.C 包(java.util.concurrent)中的高层类(Lock、同步器、阻塞队列、Executor、并发容器)依赖基础类(AQS、非阻塞数据结构、原子变量类),而基础类是通过 CAS 和 volatile 来实现的。我们尽量使用顶层的类,避免使用基础类 CAS 和 volatile 来协调线程的执行。J.U.C 包其他的内容,在其他的篇章会有相应的讲解。 Future 是一种异步执行的设计模式,类似 ajax 异步请求,不需要同步等待返回结果,可继续执行代码。使 Runnable(无返回值不支持上报异常)或 Callable(有返回值支持上报异常)均可开启线程执行任务。但是如果需要异步获取线程的返回结果,就需要通过 Future 来实现了。 Future 是位于 java.util.concurrent 包下的一个接口,Future 接口封装了取消任务,获取任务结果的方法。 在 Java 中,一般是通过继承 Thread 类或者实现 Runnable 接口来创建多线程, Runnable 接口不能返回结果,JDK 1.5 之后,Java 提供了 Callable 接口来封装子任务,Callable 接口可以获取返回结果。我们使用线程池提交 Callable 接口任务,将返回 Future 接口添加进 ArrayList 数组,最后遍历 FutureList,实现异步获取返回值。 运行结果: 上面就是异步线程执行的调用过程,实际开发中用得更多的是使用现成的异步框架来实现异步编程,如 RxJava,有兴趣的可以继续去了解,通常异步框架都是结合远程 HTTP 调用 Retrofit 框架来使用的,两者结合起来用,可以避免调用远程接口时,花费过多的时间在等待接口返回上。 线程封闭是通过本地线程 ThreadLocal 来实现的,ThreadLocal 是线程局部变量(local vari able),它为每个线程都提供一个变量值的副本,每个线程对该变量副本的修改相互不影响。 在 JVM 虚拟机中,堆内存用于存储共享的数据(实例对象),也就是主内存。Thread Local .set()、ThreadLocal.get() 方法直接在本地内存(工作内存)中写和读共享变量的副本,而不需要同步数据,不用像 synchronized 那样保证数据可见性,修改主内存数据后还要同步更新到工作内存。 Myabatis、hibernate 是通过 threadlocal 来存储 session 的,每一个线程都维护着一个 session,对线程独享的资源操作很方便,也避免了线程阻塞。 ThreadLocal 类位于 Thread 线程类内部,我们分析下它的源码: ThreadLocal 和 Synchonized 都用于解决多线程并发访问的问题,访问多线程共享的资源时,Synchronized 同步机制采用了以时间换空间的方式,提供一份变量让多个线程排队访问,而 ThreadLocal 采用了以空间换时间的方式,提供每个线程一个变量,实现数据隔离。 ThreadLocal 可用于数据库连接 Connection 对象的隔离,使得每个请求线程都可以复用连接而又相互不影响。 在 Java 里面,存在强引用、弱引用、软引用、虚引用。我们主要来了解下强引用和弱引用: 上面 a、b 对实例 A、B 都是强引用 而上面这种情况就不一样了,即使 b 被置为 null,但是 c 仍然持有对 C 对象实例的引用,而间接的保持着对 b 的强引用,所以 GC 不会回收分配给 b 的空间,导致 b 无法回收也没有被使用,造成了内存泄漏。这时可以通过 c = null; 来使得 c 被回收,但也可以通过弱引用来达到同样目的: 从源码中可以看出 Entry 里的 key 对 ThreadLocal 实例是弱引用: Entry 里的 key 对 ThreadLocal 实例是弱引用,将 key 值置为 null,堆中的 ThreadLocal 实例是可以被垃圾收集器(GC)回收的。但是 value 却存在一条从 Current Thread 过来的强引用链,只有当当前线程 Current Thread 销毁时,value 才能被回收。在 threadLocal 被设为 null 以及线程结束之前,Entry 的键值对都不会被回收,出现内存泄漏。为了避免泄漏,在 ThreadLocalMap 中的 set/get Entry 方法里,会对 key 为 null 的情况进行判断,如果为 null 的话,就会对 value 置为 null。也可以通过 ThreadLocal 的 remove 方法(类似加锁和解锁,最后 remove 一下,解锁对象的引用)直接清除,释放内存空间。 总结来说,利用 ThreadLocal 来访问共享数据时,JVM 通过设置 ThreadLocalMap 的 Key 为弱引用,来避免内存泄露,同时通过调用 remove、get、set 方法的时候,回收弱引用(Key 为 null 的 Entry)。当使用 static ThreadLocal 的时候(如上面的 Spring 多数据源),static 变量在类未加载的时候,它就已经加载,当线程结束的时候,static 变量不一定会被回收,比起普通成员变量使用的时候才加载,static 的生命周期变长了,若没有及时回收,容易产生内存泄漏。 使用线程池,可以重用存在的线程,减少对象创建、消亡的开销,可控制最大并发线程数,避免资源竞争过度,还能实现线程定时执行、单线程执行、固定线程数执行等功能。 Java 把线程的调用封装成了一个 Executor 接口,Executor 接口中定义了一个 execute 方法,用来提交线程的执行。Executor 接口的子接口是 ExecutorService,负责管理线程的执行。通过 Executors 类的静态方法可以初始化 ExecutorService 线程池。Executors 类的静态方法可创建不同类型的线程池: 但是,不建议使用 Executors 去创建线程池,而是通过 ThreadPoolExecutor 的方式,明确给出线程池的参数去创建,规避资源耗尽的风险。 如果使用 Executors 去创建线程池: 最佳的实践是通过 ThreadPoolExecutor 手动地去创建线程池,选取合适的队列存储任务,并指定线程池线程大小。通过线程池实现类 ThreadPoolExecutor 可构造出线程池的,构造函数有下面几个重要的参数: 参数 1:corePoolSize 线程池核心线程数。 参数 2:workQueue 阻塞队列,用于保存执行任务的线程,有 4 种阻塞队列可选: 参数 3:maximunPoolSize 线程池最大线程数。如果阻塞队列满了(有界的阻塞队列),来了一个新的任务,若线程池当前线程数小于最大线程数,则创建新的线程执行任务,否则交给饱和策略处理。如果是无界队列就不存在这种情况,任务都在无界队列里存储着。 参数 4:RejectedExecutionHandler 拒绝策略,当队列满了,而且线程达到了最大线程数后,对新任务采取的处理策略。 有 4 种策略可选: 最后,还可以自定义处理策略。 参数 5:ThreadFactory 创建线程的工厂。 参数 6:keeyAliveTime 线程没有任务执行时最多保持多久时间终止。当线程池中的线程数大于 corePoolSize 时,线程池中所有线程中的某一个线程的空闲时间若达到 keepAliveTime,则会终止,直到线程池中的线程数不超过 corePoolSize。但如果调用了 allowCoreThread TimeOut(boolean value) 方法,线程池中的线程数就算不超过 corePoolSize,keepAlive Time 参数也会起作用,直到线程池中的线程数量变为 0。 参数 7:TimeUnit 配合第 6 个参数使用,表示存活时间的时间单位最佳的实践是通过 ThreadPoolExecutor 手动地去创建线程池,选取合适的队列存储任务,并指定线程池线程大小。 运行结果: 线程池创建线程时,会将线程封装成工作线程 Worker,Worker 在执行完任务后,还会不断的去获取队列里的任务来执行。Worker 的加锁解锁机制是继承 AQS 实现的。 我们来看下 Worker 线程的运行过程: 总结来说,如果当前运行的线程数小于 corePoolSize 线程数,则获取全局锁,然后创建新的线程来执行任务如果运行的线程数大于等于 corePoolSize 线程数,则将任务加入阻塞队列 BlockingQueue 如果阻塞队列已满,无法将任务加入 BlockingQueue,则获取全局所,再创建新的线程来执行任务 如果新创建线程后使得线程数超过了 maximumPoolSize 线程数,则调用 Rejected ExecutionHandler.rejectedExecution() 方法根据对应的拒绝策略处理任务。 CPU 密集型任务,线程执行任务占用 CPU 时间会比较长,应该配置相对少的线程数,避免过度争抢资源,可配置 N 个 CPU+1 个线程的线程池;但 IO 密集型任务则由于需要等待 IO 操作,线程经常处于等待状态,应该配置相对多的线程如 2*N 个 CPU 个线程,A 线程阻塞后,B 线程能马上执行,线程多竞争激烈,能饱和的执行任务。线程提交 SQL 后等待数据库返回结果时间较长的情况,CPU 空闲会较多,线程数应设置大些,让更多线程争取 CPU 的调度。
2023-07-15 07:40:491

Java获取字符串中字母出现的个数

这个有什么难度呢?
2023-07-15 07:40:574

如何得到线程执行完之后返回的结果

主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示;2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。我试过网上的那个CountDownLatch,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的!PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(intparties)这个和countDownLatch就差不多了呢!你觉得呢问题补充:niuzai写道亲,CyclicBarrier可能是你想要的。PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看!问题补充:niuzai写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~嗯我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵!不过证明这个方法是可以的!问题补充:niuzai写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯你说的很对!要结合线程池的!
2023-07-15 07:41:051

java并发框架有哪些

Java并发框架java.util.concurrent是JDK5中引入到标准库中的(采用的是Doug Lea的并发库)。该包下的类可以分为这么块:Executors1)接口:Executor(例子涉及):用来执行提交的Runnable任务的对象。是一个简单的标准化接口,用来定义包括线程池、异步IO、轻量级任务框架等等。任务可以由一个新创建的线程、一个已有任务执行线程、或是线程直接调用execute()来执行,可以串行也可并行执行,取决于使用的是哪个Executor具体类。ExecutorService(例子涉及):Executor的子接口,提供了一个更加具体的异步任务执行框架:提供了管理结束的方法,以及能够产生Future以跟踪异步任务进程的方法。一个ExcutorService管理着任务队列和任务调度。ScheduledExecutorService(例子涉及):ExecutorService的子接口,增加了对延迟和定期任务执行的支持。Callable(例子涉及):一个返回结果或抛出异常的任务,实现类需要实现其中一个没有参数的叫做call的方法。Callabe类似于Runnable,但是Runnable不返回结果且不能抛出checked exception。ExecutorService提供了安排Callable异步执行的方法。Future(例子涉及):代表一个异步计算的结果(由于是并发执行,结果可以在一段时间后才计算完成,其名字可能也就是代表这个意思吧),提供了可判断执行是否完成以及取消执行的方法。2)实现:ThreadPoolExecutor和ScheduledThreadPoolExecutor:可配置线程池(后者具备延迟或定期调度功能)。Executors(例子涉及):提供Executor、ExecutorService、ScheduledExecutorService、ThreadFactory以及Callable的工厂方法及工具方法。FutureTask:对Future的实现ExecutorCompletionService(例子涉及):帮助协调若干(成组)异步任务的处理。Queues非阻塞队列:ConcurrentLinkedQueue类提供了一个高效可伸缩线程安全非阻塞FIFO队列。阻塞队列:BlockingQueue接口,有五个实现类:LinkedBlockingQueue(例子涉及)、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue和DelayQueue。他们对应了不同的应用环境:生产者/消费者、消息发送、并发任务、以及相关并发设计。TimingTimeUnit类(例子涉及):提供了多种时间粒度(包括纳秒)用以表述和控制基于超时的操作。Synchronizers 提供特定用途同步语境Semaphore(例子涉及):计数信号量,这是一种经典的并发工具。CountDownLatch(例子涉及):简单的倒计数同步工具,可以让一个或多个线程等待直到另外一些线程中的一组操作处理完成。CyclicBarrier(例子涉及):可重置的多路同步工具,可重复使用(CountDownLatch是不能重复使用的)。Exchanger:允许两个线程在汇合点交换对象,在一些pipeline设计中非常有用。Concurrent Collections除队列外,该包还提供了一些为多线程上下文设计的集合实现:ConcurrentHashMap、CopyOnWriteArrayList及CopyOnWriteArraySet。注意:"Concurrent"前缀的类有别于"synchronized"前缀的类。“concurrent”集合是线程安全的,不需要由单排斥锁控制的(无锁的)。以ConcurrentHashMap为例,允许任何数量的并发读及可调数量的并发写。“Synchronized”类则一般通过一个单锁来防止对集合的所有访问,开销大且伸缩性差。
2023-07-15 07:41:141

如何判断线程池里的线程全部执行完毕

------解决方案--------------------------------------------------------主线程做个while true循环判断所有的子线程!isAlive()------解决方案--------------------------------------------------------不知道你的线程池的实现是自写还是使用JDK提供的java.util.concurrent.ThreadPoolExecutor。如果是JDK提供的线程池。可以去判断getPoolSize()是否等于或者小于池的核心线程数量corePoolSize。当然这种情况下也存在陷阱,一就是核心线程数量无法确定是否在空闲状态,只有将corePoolSize设置为0,才能正确判断。二就是线程池对空闲线程的销毁存在一个keepAliveTime,只有要将keepAliveTime减小到你getPoolSize的频率时,可能才能正确判断。并且如果使用ThreadPoolExecutor,对于池中的线程,你无法针对某一个线程进行操作。我的感觉,你现在的需求不符合使用线程池的需求,你需要的是一个线程管理类而不是池。------解决方案--------------------------------------------------------java.util.concurrent.CyclicBarrier一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用。牢记一点:当要解决任何线程问题时,优先考虑api提供的工具。------解决方案--------------------------------------------------------顶四楼。不清楚主线程是不是可以挂起,如果可以,可以在子线程可行的位置将主线程挂起,当子线程逻辑结束后,再将主线程唤醒。仅做猜测,不可定论。这好办啊
2023-07-15 07:42:021

java并发包源码怎么读

下个jdk啊,都是带源码的
2023-07-15 07:42:111

java要学到什么程度才能胜任工作

Java作为面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用的两个特征。也正是由于其简单性、可移植性、安全性、动态性等特点,Java成为了服务器端的顶梁柱,保护着网站的一方安全。既然Java语言这么优秀,那么,如果想要以java去找工作,一个Java初学者要学多少Java知识,才能找到第一份Java工作呢?首先我们先要了解一下在工作过程中需要用到的java基础知识有哪些:1、synchronizedstatic修饰类和方法有什么区别?2、HashMap的原理,底层数据结构,rehash的过程,指针碰撞问题?3、HashMap的线程安全问题,为什么会产生这样的线程安全问题?3、ConcurrentHashMap的数据结构,底层原理,put和get是否线程安全?5、JavaIO的一些内容,包括NIO,BIO等?如果以上的基础知识大家能够运用自如,也就是说工作过程中做一些基本的事情还是可以的,但是是远远不过的,如果想要在工作过程中有自己的一席之地还是要学会以下几点,才能够勉强进入企业工作。一、Java线程池的构造方法,里面参数的含义,以及原理:1、volatile和ThreadLocal解决了什么问题2、CAS在Java中的具体实现3、Java虚拟机的构成,以及一个Java对象的生命周期,还有堆栈和方法区中存储的内容4、JVM的GC过程,包括一些实际问题的分析,比如说明一个现象,让你分析可能是什么原因会导致这样的问题,应该如何对JVM参数进行调优5、synchronized和Lock的区别,以及底层实现原理6、FullGC和MinorGC触发的条件7、GCRoots的选择8、jmap,jstat,jstack等的使用场景,MAT等9、ClassLoader的加载过程10、CountDownLatch、CyclicBarrier和Semaphore等11、Java8的新特性等二、数据库:这里的数据库包含两种,一种一般是MySQL,另外是NoSql数据库,包括Redis、MongoDB等。一般会问的问题有:1、innerjoin和leftjoin等的区别2、SQL调优,explain,profile等3、InnoDB和Myisam的区别4、ACID5、数据库的事务隔离级别,以及他们分别能解决什么问题6、Redis的几种数据结构7、Redis是单线程还是多线程8、Redis的持久化9、悲观锁和乐观锁的含义10最左前缀索引,索引的数据结构,聚簇索引等(这块还没搞明白)三、框架因为spring是我们常用的框架,所以这块的内容会问的比较多,也会比较细。1、Spring的两大特性(IoC和AOP)2、Spring的bean的生命周期3、Spring是如何解决Bean的循环引用问题的4、AOP的两种实现方式,以及两者的区别(这里其实使用了动态代理,具体动态代理分为两种,一种是JDK的动态代理,主要使用的是JDK的反射,还有一种是CGLib,两者区别可以自己搜索,文章比较多)5、AOP一般的使用场景6、Spring的事务原理MyBatis:这块问到的比较简单些:1、$和#的区别2、MyBatis和Hibernate的区别3、源码,一般问的比较少Dubbo:因为平时自己用到了Dubbo,所以这块会有问到:1、RPC的原理2、Dubbo是如何完成远程调用的3、Dubbo如何进行调优4、Dubbo的通信协议5、Dubbo是如何实现负载均衡的ZooKeeper:1、ZK的使用场景2、ZK的选举机制3、ZK的节点类型4、一致性Hash原理数据结构和算法:这块的内容是基础,如果面试官怀疑你的能力,一般一会问到这部分内容,比如树的遍历、快速排序等。linux:一般会问一些命令的使用,然后会举一个实际的场景,让你用命令去排查问题,这块自己不是很熟,需要尽快加强。随着java的普及,懂Java的人越来越多,企业也会对求职者提出更高的要求,他们更希望招聘一些马上能上手工作的,所以倾向于招聘一些有项目开发经验的,这也是为什么那么多的大学计算机专业毕业的大学生找不到工作的原因,所以越来越多的大学生才会选择毕业前后参加一些专业的Java培训班来增加实战经验。只有增加自我实力才能出于不败之地。
2023-07-15 07:42:351

java 7的新特性

Oracle在其官方网站上公布了《Java SE 7 Features and Enhancements 》,其中详细介绍了Java SE 7 中所有主要的新特性和功能增强,具体内容如下: 1.二进制形式的字面值表示2.在数值类型的字面值中使用下划线分隔符联接3.创建泛型实例时自动类型推断4.switch-case语句支持字符串类型 5.新增try-with-resources语句 6.单个catch子句同时捕获多种异常类型 7.改进使用带泛型可变参数的方法时的编译器警告和错误提示机制 1.新增javax.swing.JLayer类,一个灵活而且功能强大的Swing组件修饰器。它使你能够直接利用组件和组件的事件响应而无需修改底层组件。你可以点击查看如何使用JLayer修饰组件。2.NimbusLook&Feel(L&F)从包com.sun.java.swing移动到标准的API包javax.swing;详细信息请查看javax.swing.plaf.nimbus。尽管它不是默认的L&F,但是现在你可以非常方便地使用它了。你可以查看Java教程中NimbusLookandFeel部分的详细信息,也可以在你的程序中运行三个使用Nimbus的简单方法的代码示例。3.在以前的版本中,在同一个容器中混合使用重量级的AWT组件和轻量级的Swing组件可能会引发某些问题。不过,现在你可以在JavaSE7完美地混合使用它们了。你可以点击这里查看相关文章。4.JavaSE7支持以指定的透明度或非矩形的方式来显示窗体,你可以点击这里查看Java教程中关于如何创建带有指定透明度和非矩形的窗体的部分内容。5.类javax.swing.JColorChooser中新增了对以HSV方式来表现RGB色彩模型的支持。HSV和HSL是两种最常见的用于表示RGB色彩模型的表示方式。它们均表示色调、饱和度、亮度三个参数,不过取值形式不同。HSL的三个参数的取值范围均为0-255,HSV的三个参数的取值范围分别为0°-360°、0.0-1.0、0.0-1.0。 1.包java.nio.file以及相关联的包java.nio.file.attribute提供对文件IO以及访问文件系统更全面的支持。JDK7也支持zip压缩格式的文件系统。你可以参考以下资源获得更多信息:a)你可以点击查看Java教程中关于文件I/O(NIO2.0特性)的部分内容;nio表示非阻塞式的IO(non-blockingI/O)。b)开发一个自定义的文件系统提供者 。c)zip压缩格式的文件系统提供者 。d)目录%JAVA_HOME%/sample/nio/chatserver/下含有包括java.nio.file包在内的新API的演示示例。e)目录%JAVA_HOME%/demo/nio/zipfs/下含有NIO2.0网络文件系统的演示示例。 1.新增ECDSA/ECDH等基于ECC加密算法的支持,详情查看Java加密体系结构中供应商SunEC提供支持的算法的部分内容。2.禁用了MD2等一些弱加密算法,JavaSE7提供一种机制,用于在处理证书路径或与TLS交互时拒绝使用指定的加密算法。详情查看Java公共密钥程序员指南中的附录D:禁用指定的加密算法和Java安全套接字扩展中的禁用加密算法。3.对Java安全套接字扩展(JavaSecureSocketExtension)中的SSL/TLS进行了一系列增强和完善。 1.基于类java.util.concurrent.ForkJoinPool的fork/join框架,作为接口java.util.concurrent.Executor的一个实现,它被用来高效地运行工作线程池中的大量任务。其中还使用了一种名为work-stealing的技术,它可以充分利用多处理器来保证所有的工作线程一直正常工作。详情查看Java教程中的Fork/Join部分。目录%JAVA_HOME%/sample/forkjoin/中包含fork/join的演示示例。2.新增java.util.concurrent.ThreadLocalRandom类,它消除了使用伪随机数的线程之间的竞争。在多线程并发访问的情况下,使用ThreadLocalRandom比使用Math.random()可以减少并发线程之间的竞争,从而获得更好的性能。例如:a) intr=ThreadLocalRandom.current().nextInt(4,77);b) //将返回一个4-77之间的随机整数(不包含77)。3.新增java.util.concurrent.Phaser类,它是一个新的类似于java.util.concurrent.CyclicBarrier的线程同步障碍辅助工具类(它允许一组线程互相等待,直到到达某个公共屏障点)。 1.一个新的基于XRender的渲染管道能够提供改进的图形运行性能,以支持现在的基于DirectX11的桌面应用。默认情况下,这个渲染管道并未启用,不过你可以使用命令行设置属性-Dsun.java2d.xrender=true来启用它。2.现在JDK可以通过诸如GraphicsEnvironment.getAvailableFontFamilyNames等方法来枚举并显示系统中已安装的OpenType/CFF字体了,并且这些字体都可以被方法Font.createFont识别。你可以查看Java教程选择指定的字体。3.类java.awt.font.TextLayout现在可以支持西藏文字的脚本了。4.在Windows和Solaris操作系统中,文件fontconfig.properties中静态指定了JDK可以使用的逻辑字体。不过,在多数Linux系统的实现中,并没有保证在特定的语言环境下对特定字体表现的支持。在JavaSE7中,libfontconfig可选择在「未识别」的Linux平台上使用的逻辑字体。更多信息可以查看Fontconfig。 1.JavaSE7现在已经更新JavaAPIforXMLProcessing(JAXP)至1.4.5版本,与以前的版本相比,该版本修复了许多bug,并且做了许多的改进,尤其是在一致性、安全性和性能方面。虽然JAXP仍然处于1.4版本,不过StAX已经升级到了1.2版本。更多信息你可以查看JAXP1.4.5发行说明以及JAXP1.4.5更新日志。2.JavaSE7更新JavaArchitectureforXMLBinding(JAXB)至2.2.3版本,详情查看2.2以上版本的JAXB更新日志。3.JavaSE7更新JavaAPIforXMLWebServices(JAX-WS)至2.2.4版本。详情查看2.2以上版本的JAX-WS更新日志。 1.java虚拟机支持非Java语言2.G1(Garbage-First)垃圾收集器3.JavaHotSpot虚拟机性能增强 1.支持使用try-with-resources语句进行自动的资源释放,包括连接、语句和结果集2.支持RowSet1.1
2023-07-15 07:42:541

Java编程题:三线程接力

只是简单控制的话,用不到线程啊
2023-07-15 07:43:105

如何设置当子任务全部完成后,主任务自动下一步

主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示;2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。我试过网上的那个 CountDownLatch ,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的!PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(int parties)这个和countDownLatch就差不多了呢!你觉得呢 问题补充:niuzai 写道亲,CyclicBarrier可能是你想要的。PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看! 问题补充:niuzai 写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~ 嗯 我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵!不过证明这个方法是可以的! 问题补充:niuzai 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!
2023-07-15 07:43:481

有没有关于java深入一点的书推荐?

学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处:1.能出版出来的书一定是经过反复的思考、雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料。2.对着书上的代码自己敲的时候方便。“看完书之后再次提升自我的最好途径是看一些相关的好博文“,我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提炼,对于梳理学习的内容很有好处,当然这里不是说自己的学习方法,就不再扯下去了。很多程序员们往往有看书的冲动,但不知道看哪些书,下面我就给各位Java程序猿们推荐一些好书(每本书的作者会加粗标红),其中绝大多数都是我自己平时在看的书,也算是我对于平时读的书做一个小总结和读后感吧。首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life。目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客。这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是:随便开篇点明该设计模式的定义图文并茂讲解该设计模式中的结构以详细的代码形式写一下该种设计模式的实现补充内容讲解该设计模式的优缺点对于一个设计模式我们关注、学习的知识点,不就是上面这些吗?不过我要重点提醒一下网友们,同一种设计模式的写法有多种,并不是说只有按某种写法来写才是这种设计模式。比方说适配器模式,我们关注适配器模式一定要关注的是什么是适配器模式不是怎么写适配器模式,不要认为某段代码不是按照适配器模式的写法写下来的它就不是适配器模式了,记住这一点,你在学习设计模式的时候一定会对代码中用到的设计模式有更深入的理解。1、深入理解Java虚拟机:JVM高级特性与最佳实践如果你不满足于做一个只会写ifelse的Java程序员,而是希望更进一步,我随便举几个例子吧:了解Java代码的底层运行机制定位性能问题对整个系统进行性能调优解决各种奇奇怪怪的线上线下问题更加高级别的,为自己的项目量身定做一款适合自己项目的虚拟机那么Java虚拟机是你必学的一门技术。《深入理解Java虚拟机:JVM高级特性与最佳实践》作者是周志明,这本书可以说是国内写得最好的有关Java虚拟机的书籍,近半年,前前后后这本书我起码看了有5遍。国内写虚拟机的书除了这本,其实还有一些其他的,我也买过,不过粗略看下来,很多内容也是《深入理解Java虚拟机:JVM高级特性与最佳实践》此书里面的。另外值得一提的是,《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书,有电子版的,网上搜一下就能下载到了。不过建议有兴趣的朋友还是去买书看,电子版本下载到的一般是比较老的版本,相比最新修订版的《深入理解Java虚拟机:JVM高级特性与最佳实践》,有很多作者新补充的知识点是没有的。2、HotSpot实战所有的Java虚拟机都是遵循着Java虚拟机规范来的,市面上的Java虚拟机几十款,《深入理解Java虚拟机:JVM高级特性与最佳实践》一书里面讲的虚拟机并不针对某种特定的虚拟机,而是从Java虚拟机规范的角度来讲解Java虚拟机。我们平时使用的乃至商用的大多数Java虚拟机都是Sun公司的HotSpot,大家cmd进入命令行,使用”java-version”命令就可以看到了。如果希望在Java虚拟机规范的基础上更加深入地去理解虚拟机的一些细节是怎么实现的,就可以看一下《HotSpot实战》一书,作者是陈涛。不过由于HotSpot的源码都是C/C++写的,所以要求读者有非常好的C/C++基础,如果对这两门语言不是很熟悉的朋友,看这本书可能对你帮助不是很大。最后提一句,如果有兴趣的朋友,不妨先去网上下载一个openJDK,HotSpot的源码就在里面。3、Java并发编程实战这本书常常被列入Java程序员必读十大书籍排行榜前几位,不过个人不是很推荐这本书。《Java并发编程实战》作者是BrianGoetz,怎么说呢,这本书前前后后我也看了两遍左右,个人感受是:文字多代码少讲解多实践少我觉得这可能就是老外写书的特点吧,因为Java是北美国家(加拿大、美国)开发和维护的,所以老外对Java方方面面的理论知识体系都掌握得是非常清楚和透彻的。翻开这本书看,多线程什么用、什么是死锁、什么是竞争、什么是线程安全等等,方方面面的知识点都用大量的文字篇幅讲解,不免让人感觉十分枯燥,也难让读者有实质性的进步。我这本书看了两遍也属于一目十行意思,有兴趣的地方就重点看一下。无论如何,作为一本常常位于Jva程序员必读十大书籍排行榜前几名的书,还是一定要推荐给大家的。4、java多线程编程核心技术《Java多线程编程核心技术》作者高洪岩。想要学习多线程的朋友,这本书是我大力推荐的,我的个人博客里面二十多篇的多线程博文都是基于此书,并且在这本书的基础上进行提炼和总结而写出来的。此书和《Java并发编程实战》相反,这本书的特点是大篇幅的代码+小篇幅的精讲解,可能这和中国人写的书比较偏向实用主义的风格有关。本书关于线程安全、synchronized、Reentrant、Timer等等都用详细的代码进行了讲解,而且每个大知识点下的多个小知识点都会详细讲解到,非常有实践价值。有兴趣的朋友们,我相信只要你们跟着这本书里面的代码敲、运行、思考,三步走,对于多线程的使用与理解一定会进几大步。不过这本书的缺点就是对于Java并发包下的一些类像CountDownLatch、Semphore、CyclicBarrier、Future、Callable等都没有讲到,重点的CAS和AQS也没有触及,重点类的实现原理也没有提。当然,这很深入了,在学习了这本书之后如果能再去对这些知识进行一些学习、研究的话,你一定会慢慢成长为一个很厉害的多线程高手。5、EffectiveJava中文版这是唯一一本我没有买的书。初识这本书,是在我的博文Java代码优化(长期更新)里面,底下评论的时候有朋友提到了这本书,当时我说要去买,不过这两个月一直都没时间去逛书店,甚是遗憾,之后肯定会找时间去买这本书的。《EffectiveJava中文版》的作者是JoshuaBloch,这个人就很厉害了,他是谷歌的首席架构师,属于超级技术大牛级别了吧,呵呵。由于没有看过这本书,所以我不好发表评论,但是从这本书的知名度以及其作者的来头来看(多提一句,这本书也是Java之父JamesGosling博士推崇的一本书),我相信这一定是一本值得一看的好书。好的代码是每个Java程序员都应该去追求的,不是说我今天写一段好代码相比写一段烂代码对性能会有多大的提升,更多的应该是提升了代码的可读性以及可以规避许多潜在的、未知的问题,避免代码上线之后出问题而花时间去维护—-无论从时间成本、人力成本还是风险成本来说,这都是非常高的。6、深入分析JavaWeb技术内幕《深入分析JavaWeb技术内幕》,作者许令波,淘宝工程师。这本书我用一个字概括就是:全。真的非常全,HTTP、DNS、CDN、静态化、Jetty、Tomcat、Servlet、Spring、MyBatis等等,什么都有,涉及知识面非常广,但又不像专门精讲某个知识点的书籍一样讲得非常深入,感觉这本书就是尽量去用短的篇幅讲清楚一些JavaWeb使用到的技术的内幕,让读者对这些知识点的技术内幕有一个理性的认识。不过,尽管每个知识点的篇幅都不多,但是重点都基本讲到了,是一本让人真正有收获的书。如果想进一步了解这些技术的技术内幕,就要自己去买相关书籍或者自己上网查资料了,有种抛砖引玉,或者说师傅领进门、修行在个人的感觉。7、大型网站技术架构核心原理与案例分析一个字评价这本书,_;两个字评价这本书,很_;三个字评价这本书,非常_。呵呵,好了,再说下去可能别人以为我是水军了。《大型网站技术架构核心原理与案例分析》的作者是李智慧,原阿里巴巴技术专家。Java的大多数应用都是用在Web上的,现在只要稍微大型一点的Web应用,都一定是一个分布式系统,那么一个分布式系统用到了哪些技术?一个大型网站是如何从一个小型网站成长起来的?如何保证你的网站安全?分布式系统使用到了缓存,有哪些缓存?缓存的使用有哪些值得注意的事项?关于分布式的知识点,都在这本书里面有体现,只有你想不到,没有他写不到,而且写得非常易懂,基本属于看一两遍,再记一些笔记就知道是怎么一回事儿了。多看几遍,对分布式的理解一定会加深不少。而且里面不仅仅是分布式的知识,还非常接地气地写了如何做一个好的架构师,其实我认为这不仅仅是写给想做架构师的读者看的,就是给读者一些建议,如何更好地提出意见、如何更让别人关注你的声音、如何看到他人的优点,入木三分,让人获益匪浅。8、大型网站系统与Java中间件实践《大型网站系统与Java中间件实践》作者曾宪杰,是淘宝的技术总监,算起来应该在阿里有至少P8的级别了吧。这本书的部分内容和上面一本李智慧的《大型网站技术架构核心原理与案例分析》有所重合,像分布式系统的演化、CDN、CAP理论和BASE理论等等,这也更说明这些都是分布式系统或者说是一个大型网站重点关注的内容,当作一次再学习也不错。本书要突出的重点是中间件三个字,中间件是分布式系统中一个非常重要的东西,其最重要的作用应该就是解耦,降低模块与模块之间的强依赖,不同的模块之间的依赖度降低,便可以各自独立地开发自己的功能,这也可以说是软件工程发展的目标和驱动力。因此,本书有一部分的内容就是基于中间件,详细讲解了中间件与JMS的各种知识,适合对分布式系统比较熟悉并且想要往中间件方面有一定研究的读者。9、从Paxos到ZooKeeper分布式一致性原理与实践《从Paxos到ZooKeeper分布式一致性原理与实践》,作者倪超,阿里巴巴工程师。这本书是我最近在研读的一本书,和上面的《大型网站系统与Java中间件实践》一样,属于分布式组件的范畴,属于有些深入的内容,当然也是我自己的个人兴趣。当然,如果有志向做一个出色的大型网站架构师、公司的技术总监之类,这些知识当然是必须掌握的。本书从分布式系统基本理论开始讲起,讲到Paxos算法,最后慢慢引入到Zookeeper,循序渐进。当然,更多的我目前还不方便发表什么看法,因为这本书的第二张Paxos算法我都还没有弄懂(Paxos算法确实有些难以理解和不太易懂),接下来的章节还没有看下去。如果网友们所在的公司在使用Zookeeper,并且你又对Zookeeper感兴趣想要研究一下它的原理的,这本书将是不二之选。10、MySQL5.6从零开始学《MySQL5.6从零开始学》,作者刘增杰和李坤。作为一名Java程序员,我认为我们千万不要觉得数据库是DBA的事情,数据库对一个Java程序员来说也是必须掌握的一门知识,丰富的数据库性能优化经验是一个顶尖程序员必备技能。目前主流的数据库有Oracle和MySQL,当然推荐大家的是MySQL,主要原因我认为有两点:1、MySQL相比Oracle更轻量级、更小、安装和卸载更方便,SQL其实都是差不多的,如果想学数据库,学MySQL就可以了,在家里面可以自己方便地研究,如果你的公司使用Oracle,只要再用对比学习法,关注一下Oracle和MySQL的差别即可2、随着2009年阿里巴巴去IOE的运动的进行,目前国内的很多互联网公司都会选择MySQL作为它们使用的数据库,因为MySQL免费,所以既省钱又不需要出了问题就依赖甲骨文公司MySQL学习我推荐的是这本我自己学习看的《MySQL5.6从零开始学》,我是觉得挺好的这本书,书里面的知识点很细致、很全面,读者选择书籍的标准大多不就是这两点吗?11、Spring源码深度解析《Spring源码深度解析》,作者郝佳。Spring这个框架做得太好了,功能太强大了,以至于很多开发者都只知Spring,不知什么是工厂、什么是单例、什么是代理(我面试别人的真实体会)。这种功能强大的框架内部一定是很复杂的实现,这就导致一旦你的程序使用Spring,出了问题,可能是Error、可能是Exception、可能是程序运行结果不是你的预期的,出现诸如此类问题的时候,将会让你感到困惑,除了上网查资料或者问别人似乎没有更好的解决办法。研读Spring的源代码不失为一种很好的学习方法,我个人认为这有很多好处:理解框架内部的实现之后,可以主动去解决问题,而不需要依赖别人Spring框架内部实现用到了很多设计模式,很好的代码设计思路,这将会对你写代码、对你理解设计模式有很大的提高研究Spring框架将会大大增强你读代码的能力,我相信只要你能研究清楚Spring内部是如何实现的,其他任何一个框架的源代码都难不倒你总而言之,我认为读代码的能力是一个普通的程序员和一个好的程序员之间最大的差别之一,前者只会把别人写好的东西拿来用,后者不仅能用好,还清楚知道别人写好的东西底层是如何实现的,在出现问题的时候可以轻松解决。Spring源代码,个人推荐《Spring源码深度解析》一书,真要研究透并且写清楚Spring源代码,恐怕三四本书都不够,作者在近400页的篇幅中尽量去讲解Spring源代码是如何实现的,殊为不易,尽管无法讲得完全,但是相信作者的讲解配合上读者自己的研究,一定可以对Spring的实现有更深度的理解。以上就是我对Java高级部分应该看的书籍的推荐,希望可以对你有所帮助。说一点我的建议,我们学Java技术更重要的还是看视频教程,我们只有看更多的视频教程,不断的练习,在脑海当中产生深刻的记忆。我永远坚信我的一句话:书籍能诠释的东西毕竟有限。最后在这里推荐大家关注一下我的微信公众号:Java新手学习,给你准备了一套最新的Java基础精讲视频教程和Java系统学习路线,关注即可观看。
2023-07-15 07:43:551

多线程:所有线程执行到一个地方才往下执行,怎么实现

主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示;2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。我试过网上的那个 CountDownLatch ,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的!PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(int parties)这个和countDownLatch就差不多了呢!你觉得呢 问题补充:niuzai 写道亲,CyclicBarrier可能是你想要的。PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看! 问题补充:niuzai 写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~ 嗯 我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵!不过证明这个方法是可以的! 问题补充:niuzai 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!
2023-07-15 07:44:031

如何实现主线程需要等待子线程的结果,然后才能往下执行

主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示;2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。我试过网上的那个 CountDownLatch ,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的!PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(int parties)这个和countDownLatch就差不多了呢!你觉得呢 问题补充:niuzai 写道亲,CyclicBarrier可能是你想要的。PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看! 问题补充:niuzai 写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~ 嗯 我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵!不过证明这个方法是可以的! 问题补充:niuzai 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!
2023-07-15 07:44:101

线程池如何让主线程知道所有子线程已经执行完成

------解决方案--------------------------------------------------------主线程做个while true循环判断所有的子线程!isAlive()------解决方案--------------------------------------------------------不知道你的线程池的实现是自写还是使用JDK提供的java.util.concurrent.ThreadPoolExecutor。如果是JDK提供的线程池。可以去判断getPoolSize()是否等于或者小于池的核心线程数量corePoolSize。当然这种情况下也存在陷阱,一就是核心线程数量无法确定是否在空闲状态,只有将corePoolSize设置为0,才能正确判断。二就是线程池对空闲线程的销毁存在一个keepAliveTime,只有要将keepAliveTime减小到你getPoolSize的频率时,可能才能正确判断。并且如果使用ThreadPoolExecutor,对于池中的线程,你无法针对某一个线程进行操作。我的感觉,你现在的需求不符合使用线程池的需求,你需要的是一个线程管理类而不是池。------解决方案--------------------------------------------------------java.util.concurrent.CyclicBarrier一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用。牢记一点:当要解决任何线程问题时,优先考虑api提供的工具。------解决方案--------------------------------------------------------顶四楼。不清楚主线程是不是可以挂起,如果可以,可以在子线程可行的位置将主线程挂起,当子线程逻辑结束后,再将主线程唤醒。仅做猜测,不可定论。这好办啊
2023-07-15 07:44:191

java中cyclicbarrier 和 countdownlatch有什么不同

cyclibarriar 就是栅栏,顾名思义:就是一个拦截的装置。多个线程start后,在栅栏处阻塞住,一般定义栅栏的时候会定义有多少个线程。比如定义为4个,那么有三个线程到栅栏处,就阻塞住,如果没有第四个,就会一直阻塞,知道启动第四个线程到栅栏
2023-07-15 07:45:311

cyclicbarrier 怎么知道 最后一个线程

  首先,CyclicBarrier可以多次使用,CountDownLatch只能用一次(为0后不可变)  其次,  Barrier是等待指定数量线程到达再继续处理;  Latch是等待指定事件变为指定状态后发生再继续处理,对于CountDown就是计数减为0的事件,但你也可以实现或使用其他Latch就不是这个事件了…  Barrier是等待指定数量任务完成,Latch是等待其他任务完成指定状态的改变再继续……
2023-07-15 07:45:401

java课程设计模拟接力赛赛跑

package hh; import java.util.Random; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; class Player implements Runnable{ private String name; private CyclicBarrier barrier; private Player next;//下一棒 private int time;//用时 private boolean run;//第一棒 public Player(String name, CyclicBarrier barrier, boolean run) { super(); this.name = name; this.setBarrier(barrier); this.run = run; } public void run() { try { synchronized (this) { while(!run){//等待队员 wait(); } } Random r = new Random(); TimeUnit.MILLISECONDS.sleep(r.nextInt(2000)); next(next,11 + r.nextInt(2)); } catch (InterruptedException e) { e.printStackTrace(); } } private void next(Player next, int time) { System.out.println(name + " 用时:" + time + ",交接棒"); if(next != null){ next.setTime(this.time + time); synchronized (next) { next.setRun(true); next.notify(); } }else{ System.out.println("跑完,总用时:" + (this.time + time)); } } public void setTime(int time) { this.time = time; } public int getTime(){ return this.time; } public void setNext(Player next) { this.next = next; } public void setRun(boolean run) { this.run = run; } public void setBarrier(CyclicBarrier barrier) { this.barrier = barrier; } public CyclicBarrier getBarrier() { return barrier; } } public class RelayRace { public static void main(String[] args) throws InterruptedException { final Player[] players = new Player[4]; ExecutorService exec = Executors.newCachedThreadPool(); CyclicBarrier barrier = new CyclicBarrier(4, new Runnable() { public void run() { System.out.println("结束,总用时:" + players[3].getTime()); } }); for(int i = 0; i < 4; i++){ players[i] = new Player("队员" + ( i + 1), barrier, i == 0); } for(int i = 0; i < 4; i++){ if( i < 3){ players[i].setNext(players[i + 1]); exec.execute(players[i]); }else{ exec.execute(players[3]); break; } } } }
2023-07-15 07:45:571

jdk提供的用于并发编程的同步器有哪些

CountDownLatch,CyclicBarrier和Semaphore
2023-07-15 07:46:041

主线程等待子线程运行结束再完成的效果如何实现

主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。 这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。 应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示; 2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。 我试过网上的那个 CountDownLatch ,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的! PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(int parties) 这个和countDownLatch就差不多了呢! 你觉得呢 问题补充:niuzai 写道亲,CyclicBarrier可能是你想要的。 PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看! 问题补充:niuzai 写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~ 嗯 我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵! 不过证明这个方法是可以的! 问题补充:niuzai 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!
2023-07-15 07:46:241

CountDownLatch和CyclicBarrier的区别

首先,CyclicBarrier可以多次使用,CountDownLatch只能用一次(为0后不可变) 其次, Barrier是等待指定数量线程到达再继续处理; Latch是等待指定事件变为指定状态后发生再继续处理,对于CountDown就是计数减为0的事件,但你也可以实现或使用其。
2023-07-15 07:46:321

如何使“主线程”等待“子线程”执行结束后再继续执行

主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。 这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。 应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示; 2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。 我试过网上的那个 CountDownLatch ,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的! PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(int parties) 这个和countDownLatch就差不多了呢! 你觉得呢 问题补充:niuzai 写道亲,CyclicBarrier可能是你想要的。 PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看! 问题补充:niuzai 写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~ 嗯 我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵! 不过证明这个方法是可以的! 问题补充:niuzai 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!
2023-07-15 07:46:461

java学习书籍有哪些比较好?

“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考、雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料2.对着书上的代码自己敲的时候方便“看完书之后再次提升自我的最好途径是看一些相关的好博文“,我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提炼,对于梳理学习的内容很有好处,当然这里不是说自己的学习方法,就不再扯下去了。很多程序员们往往有看书的冲动,但不知道看哪些书,下面我就给各位Java程序猿们推荐一些好书。一《深入理解Java虚拟机:JVM高级特性与最佳实践》如果你不满足于做一个只会写if…else…的Java程序员,而是希望更进一步,我随便举几个例子吧:1、了解Java代码的底层运行机制2、定位性能问题3、对整个系统进行性能调优4、解决各种奇奇怪怪的线上线下问题5、更加高级别的,为自己的项目量身定做一款适合自己项目的虚拟机那么Java虚拟机是你必学的一门技术。《深入理解Java虚拟机:JVM高级特性与最佳实践》作者是周志明,这本书可以说是国内写得最好的有关Java虚拟机的书籍,近半年,前前后后这本书我起码看了有5遍。国内写虚拟机的书除了这本,其实还有一些其他的,我也买过,不过粗略看下来,很多内容也是《深入理解Java虚拟机:JVM高级特性与最佳实践》此书里面的。另外值得一提的是,《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书,有电子版的,网上搜一下就能下载到了。不过建议有兴趣的朋友还是去买书看,电子版本下载到的一般是比较老的版本,相比最新修订版的《深入理解Java虚拟机:JVM高级特性与最佳实践》,有很多作者新补充的知识点是没有的。二、《HotSpot实战》所有的Java虚拟机都是遵循着Java虚拟机规范来的,市面上的Java虚拟机几十款,《深入理解Java虚拟机:JVM高级特性与最佳实践》一书里面讲的虚拟机并不针对某种特定的虚拟机,而是从Java虚拟机规范的角度来讲解Java虚拟机。我们平时使用的乃至商用的大多数Java虚拟机都是Sun公司的HotSpot,大家cmd进入命令行,使用”java -version”命令就可以看到了。如果希望在Java虚拟机规范的基础上更加深入地去理解虚拟机的一些细节是怎么实现的,就可以看一下《HotSpot实战》一书,作者是陈涛。不过由于HotSpot的源码都是C/C++写的,所以要求读者有非常好的C/C++基础,如果对这两门语言不是很熟悉的朋友,看这本书可能对你帮助不是很大。最后提一句,如果有兴趣的朋友,不妨先去网上下载一个openJDK,HotSpot的源码就在里面。三、《Java并发编程实战》这本书常常被列入Java程序员必读十大书籍排行榜前几位,不过个人不是很推荐这本书。《Java并发编程实战》作者是Brian Goetz,怎么说呢,这本书前前后后我也看了两遍左右,个人感受是:1、文字多代码少2、讲解多实践少我觉得这可能就是老外写书的特点吧,因为Java是北美国家(加拿大、美国)开发和维护的,所以老外对Java方方面面的理论知识体系都掌握得是非常清楚和透彻的。翻开这本书看,多线程什么用、什么是死锁、什么是竞争、什么是线程安全等等,方方面面的知识点都用大量的文字篇幅讲解,不免让人感觉十分枯燥,也难让读者有实质性的进步。我这本书看了两遍也属于一目十行意思,有兴趣的地方就重点看一下。无论如何,作为一本常常位于Jva程序员必读十大书籍排行榜前几名的书,还是一定要推荐给大家的。四、《java多线程编程核心技术》《Java多线程编程核心技术》作者高洪岩。想要学习多线程的朋友,这本书是我大力推荐的,我的个人博客里面二十多篇的多线程博文都是基于此书,并且在这本书的基础上进行提炼和总结而写出来的。此书和《Java并发编程实战》相反,这本书的特点是大篇幅的代码+小篇幅的精讲解,可能这和中国人写的书比较偏向实用主义的风格有关。本书关于线程安全、synchronized、Reentrant、Timer等等都用详细的代码进行了讲解,而且每个大知识点下的多个小知识点都会详细讲解到,非常有实践价值。有兴趣的朋友们,我相信只要你们跟着这本书里面的代码敲、运行、思考,三步走,对于多线程的使用与理解一定会进几大步。不过这本书的缺点就是对于Java并发包下的一些类像CountDownLatch、Semphore、CyclicBarrier、Future、Callable等都没有讲到,重点的CAS和AQS也没有触及,重点类的实现原理也没有提。当然,这很深入了,在学习了这本书之后如果能再去对这些知识进行一些学习、研究的话,你一定会慢慢成长为一个很厉害的多线程高手。五、《Effective Java中文版》《Effective Java中文版》的作者是Joshua Bloch,这个人就很厉害了,他是谷歌的首席架构师,属于超级技术大牛级别了吧,这本书也是Java之父James Gosling博士推崇的一本书,我相信这一定是一本值得一看的好书。好的代码是每个Java程序员都应该去追求的,不是说我今天写一段好代码相比写一段烂代码对性能会有多大的提升,更多的应该是提升了代码的可读性以及可以规避许多潜在的、未知的问题,避免代码上线之后出问题而花时间去维护—-无论从时间成本、人力成本还是风险成本来说,这都是非常高的。六、《深入分析Java Web技术内幕》《深入分析Java Web技术内幕》,作者许令波,淘宝工程师。这本书用一个字概括就是:全。真的非常全,HTTP、DNS、CDN、静态化、Jetty、Tomcat、Servlet、Spring、MyBatis等等,什么都有,涉及知识面非常广,但又不像专门精讲某个知识点的书籍一样讲得非常深入,感觉这本书就是尽量去用短的篇幅讲清楚一些Java Web使用到的技术的内幕,让读者对这些知识点的技术内幕有一个理性的认识。不过,尽管每个知识点的篇幅都不多,但是重点都基本讲到了,是一本让人真正有收获的书。如果想进一步了解这些技术的技术内幕,就要自己去买相关书籍或者自己上网查资料了,有种抛砖引玉,或者说师傅领进门、修行在个人的感觉。七、《大型网站技术架构 核心原理与案例分析》《大型网站技术架构 核心原理与案例分析》的作者是李智慧,原阿里巴巴技术专家。Java的大多数应用都是用在Web上的,现在只要稍微大型一点的Web应用,都一定是一个分布式系统,那么一个分布式系统用到了哪些技术?一个大型网站是如何从一个小型网站成长起来的?如何保证你的网站安全?分布式系统使用到了缓存,有哪些缓存?缓存的使用有哪些值得注意的事项?关于分布式的知识点,都在这本书里面有体现,只有你想不到,没有他写不到,而且写得非常易懂,基本属于看一两遍,再记一些笔记就知道是怎么一回事儿了。多看几遍,对分布式的理解一定会加深不少。而且里面不仅仅是分布式的知识,还非常接地气地写了如何做一个好的架构师,其实我认为这不仅仅是写给想做架构师的读者看的,就是给读者一些建议,如何更好地提出意见、如何更让别人关注你的声音、如何看到他人的优点,入木三分,让人获益匪浅。八、《大型网站系统与Java中间件实践》《大型网站系统与Java中间件实践》作者曾宪杰,是淘宝的技术总监,算起来应该在阿里有至少P8的级别了吧。这本书的部分内容和上面一本李智慧的《大型网站技术架构 核心原理与案例分析》有所重合,像分布式系统的演化、CDN、CAP理论和BASE理论等等,这也更说明这些都是分布式系统或者说是一个大型网站重点关注的内容,当作一次再学习也不错。本书要突出的重点是中间件三个字,中间件是分布式系统中一个非常重要的东西,其最重要的作用应该就是解耦,降低模块与模块之间的强依赖,不同的模块之间的依赖度降低,便可以各自独立地开发自己的功能,这也可以说是软件工程发展的目标和驱动力。因此,本书有一部分的内容就是基于中间件,详细讲解了中间件与JMS的各种知识,适合对分布式系统比较熟悉并且想要往中间件方面有一定研究的读者。九、《从Paxos到ZooKeeper 分布式一致性原理与实践》《从Paxos到ZooKeeper 分布式一致性原理与实践》,作者倪超,阿里巴巴工程师。这本书和上面的《大型网站系统与Java中间件实践》一样,属于分布式组件的范畴,属于有些深入的内容,当然,如果有志向做一个出色的大型网站架构师、公司的技术总监之类,这些知识当然是必须掌握的。本书从分布式系统基本理论开始讲起,讲到Paxos算法,最后慢慢引入到Zookeeper,循序渐进。当然,更多的我目前还不方便发表什么看法,因为这本书的第二张Paxos算法我都还没有弄懂(Paxos算法确实有些难以理解和不太易懂),接下来的章节还没有看下去。如果网友们所在的公司在使用Zookeeper,并且你又对Zookeeper感兴趣想要研究一下它的原理的,这本书将是不二之选。十、《MySQL5.6从零开始学》《MySQL5.6从零开始学》,作者刘增杰和李坤。作为一名Java程序员,我认为我们千万不要觉得数据库是DBA的事情,数据库对一个Java程序员来说也是必须掌握的一门知识,丰富的数据库性能优化经验是一个顶尖程序员必备技能。目前主流的数据库有Oracle和MySQL,当然推荐大家的是MySQL,主要原因我认为有两点:1、MySQL相比Oracle更轻量级、更小、安装和卸载更方便,SQL其实都是差不多的,如果想学数据库,学MySQL就可以了,在家里面可以自己方便地研究,如果你的公司使用Oracle,只要再用对比学习法,关注一下Oracle和MySQL的差别即可2、随着2009年阿里巴巴去IOE的运动的进行,目前国内的很多互联网公司都会选择MySQL作为它们使用的数据库,因为MySQL免费,所以既省钱又不需要出了问题就依赖甲骨文公司MySQL学习我推荐《MySQL5.6从零开始学》,我是觉得挺好的这本书,书里面的知识点很细致、很全面,读者选择书籍的标准大多不就是这两点吗?十一、《Spring源码深度解析》《Spring源码深度解析》,作者郝佳。Spring这个框架做得太好了,功能太强大了,以至于很多开发者都只知Spring,不知什么是工厂、什么是单例、什么是代理。这种功能强大的框架内部一定是很复杂的实现,这就导致一旦你的程序使用Spring,出了问题,可能是Error、可能是Exception、可能是程序运行结果不是你的预期的,出现诸如此类问题的时候,将会让你感到困惑,除了上网查资料或者问别人似乎没有更好的解决办法。研读Spring的源代码不失为一种很好的学习方法,我个人认为这有很多好处:1、理解框架内部的实现之后,可以主动去解决问题,而不需要依赖别人2、Spring框架内部实现用到了很多设计模式,很好的代码设计思路,这将会对你写代码、对你理解设计模式有很大的提高3、研究Spring框架将会大大增强你读代码的能力,我相信只要你能研究清楚Spring内部是如何实现的,其他任何一个框架的源代码都难不倒你总而言之,我认为读代码的能力是一个普通的程序员和一个好的程序员之间最大的差别之一,前者只会把别人写好的东西拿来用,后者不仅能用好,还清楚知道别人写好的东西底层是如何实现的,在出现问题的时候可以轻松解决。Spring源代码,个人推荐《Spring源码深度解析》一书,真要研究透并且写清楚Spring源代码,恐怕三四本书都不够,作者在近400页的篇幅中尽量去讲解Spring源代码是如何实现的,殊为不易,尽管无法讲得完全,但是相信作者的讲解配合上读者自己的研究,一定可以对Spring的实现有更深度的理解。后记以上就是我推荐给Java开发者们的一些值得一看的好书。但是这些书里面并没有Java基础、Java教程之类的书,对于Java基础知识的学习,我提两点建议吧:多写多敲代码,好的代码与扎实的基础知识一定是实践出来的。希望对您有所帮助!~
2023-07-15 07:47:174

JAVA学习笔记JDK6和7的区别?

坐等高手,在项目中还没有用到过,我也想知道。
2023-07-15 07:47:253

有谁知道这三个女生的胸有多大昂,abcd哪一个?有谁知道么?

c,c,c
2023-07-15 07:46:4215

收集带有“ming”的成语

明哲保身接龙:明哲保身-身不由己-几所不欲-欲扬先抑-抑郁寡欢-欢天喜地
2023-07-15 07:46:442

大卫杜夫是哪个国家的?

说到davidoff大卫杜夫这个品牌,很多人首先会想到的就是davidoff大卫杜夫的雪茄和香水,其中不少人对于davidoff大卫杜夫的香水都是格外感兴趣的,那么davidoff大卫杜夫是哪个国家的?大卫杜夫是奢侈品吗?大卫杜夫到底是个什么牌子?1、大卫杜夫品牌介绍大卫·杜夫(DAVIDOFF)隶属于季诺大卫杜夫集团(ZinoDavidoffGroup),该集团于1980年由季诺·大卫杜夫创立。其企业精神为“真正的奢华体现在每时每刻对美与终极愉悦的体验”,这也是季诺·大卫杜夫的座右铭,该公司一开始曾将各门类产品授权给不同的顶级生产商,2005年,大卫杜夫解除了对奢华配饰产品生产商的授权,开始直接开发并以大卫杜夫(DAVIDOFF)为品牌名销售奢侈品配饰。2、大卫杜夫是哪个国家的季诺·大卫杜夫ZinoDavidoff(季诺·大卫杜夫)出生于1906年的3月11日,乌克兰共和国首都基辅。这个出身在1906年3月11日,双鱼座的男人给我们制造出无限的极品享受。Davidoff的品牌虽不是生来就有,但Davidoff家族似乎生来就是做烟草生意的。在Zino5岁那年,全家从混乱的俄国逃亡到了瑞士的日内瓦,也就是那一年,他的父亲在那里开了以Davidoff命名的第一家烟草店,而他的第一批顾客里有一个最响亮的名字叫列宁。DavidoffCoolWater香水,在欧美市场,已成为男士香水的主流产品,长期受到男性使用者的青睐。1970年,兹诺·大卫杜夫加入了他的老朋友恩斯特·施奈德博士的奥廷格·巴塞尔集团(成立于1875年的家族企业)。恩斯特博士分享了兹诺的人生哲学,并一起承担了大卫·杜夫国际市场的发展。以奥廷格为总部,把大卫杜夫扩张成为一个世界闻名的成功国际品牌,包括化妆品、手表、眼镜等一系列产品。其中中国消费者非常熟知的‘神秘水"香水系列就出自大卫杜夫的化妆品中。Zino于1994年在日内瓦逝世,他的人生充满了传奇经历。3、大卫杜夫是奢侈品吗大卫杜夫(Davidoff)是一个世界闻名的成功国际品牌,包括化妆品、手表、眼镜等...多数的型号,都可以选择不同档次的表带和表面。身为精品品牌大卫杜夫对雪茄质量要求极严,而负责生产的古巴雪茄局对大卫杜夫的高淘汰率感到不满,在1989年8月季诺曾公开焚烧超过十万支他认为不适合销售和低质量的雪茄,最后两者决定结束合作关系。并于1991年签署了一项协议让古巴大卫杜夫生产线正式停产。而多米尼加制造的大卫杜夫雪茄在1990年11月投入市场,生产跟以前在古巴相同尺寸的雪茄,一直延续至今。1992年12月31日后,再也没有大卫杜夫的古巴制造雪茄销售了。现在的二十几年前的古巴制大卫杜夫雪茄已经变成了收藏品,价钱比等重黄金还昂贵。一支古巴制的大卫杜夫雪茄差不多5千港币起跳。一般只能在拍卖会才能有缘遇到了。4、大卫杜夫香水怎么样Davidoff冷水男香,做为一个姑娘,我只喜欢男士香水会不会很奇怪。感觉上女香的味道让人觉得绵软,男香感觉干净利落。最爱就是“冷水”(COOLWATER)。这款被称为“来自肌肤之下”的香水,以海洋为创意的蓝本,有着清新、蔚蓝、自然的风格。Davidoff的这款香水,CoolWaterWomen冰水美人系列,清爽简洁的水晶长颈细瓶口,幽幽的蓝,静静的水,剔透如镜的一抹幽蓝,我是颜值派,完全被外表吸引神秘水专柜购买,买的时候已经只有100ml的了,买了两瓶,一瓶给了妈妈用,她很喜欢这款香水的味道!这款属于淡香水,留香时间不算长,3-4h,但是味道很好闻:香调:花果香调,鸢尾兰混合淡淡的琥珀味道前调:柑橘,黑醋栗,菠萝,蜜瓜,荷花,莲花中调:五月玫瑰,茉莉后调:鸢尾兰,香草,檀香木5、大卫杜夫香水推荐01大卫杜夫冷水女士淡香水香调:花果香调前味:柑橘、黑醋栗、菠萝、蜜瓜、荷花、莲花中味:五月玫瑰、茉莉后味:鸢尾兰、香草、檀香木、栗树、琥珀这款大卫杜夫冷水女士淡香水,清爽简洁的水晶长颈细口瓶,酷似矿泉水的包装,幽幽的蓝与净净的水,恰如其分地体现了CoolWaterWoman的灵魂。02大卫杜夫异国风情香水香调:玫瑰花香调前调:紫罗兰、水润香梨中调:小苍兰、牡丹、橙花尾调:金色雪松、麝香大卫杜夫异国风情香水,非常清新的香水,适合追求时尚的女性,完美呈现自然的女性魅力以及清新感,是冷泉系列新的创造,并以女人与海之间的永恒的爱情故事为灵感。03大卫杜夫回音回声女士香水香调:清新花果调前调:葡萄冰沙,格拉帕酒,意大利覆盆子中调:爱丽斯,桂花,玫瑰,木樨花后调:白麝香,水晶琥珀,紫罗兰木香水的设计灵感源自于调香师在巴黎一家意大利餐厅品尝格拉帕美酒之后所机发起的灵感!圆润且具线条美的香水瓶身柔和而温润,加上喷嘴部分的磨砂银,搭配浪漫的粉红,给人一种舒适优雅的感觉。
2023-07-15 07:46:451

科长日文怎么读

科长课长:かちょう
2023-07-15 07:46:4713

ming为什么没有一声

发音用不到。在日常的说话拼音方式中,是用不到ming的一声的,所以没有一声。发音,语言学名词,是指人通过控制咽喉部的气流强弱、声带机械波所发出的声音(多指语言和音乐)。
2023-07-15 07:46:501

山东威海市2018年中级会计职称考试合格证书办理地点及联系方式

  会计专业技术资格证书办理地点及联系方式   市直:威海市人事考试中心(胶州路7号,威海市人力资源和社会保障局7楼706号),联系电话:0631—5226661。   环翠区:环翠区科干办(威海市杏花西街1号406室),联系电话:0631-5224845。   文登区:文登区考试培训中心(文登区世纪大道84号913室),联系电话:0631-8981706。   荣成市:荣成市专业技术人员管理办公室(荣成市府西路178号市府广场路西人力资源和社会保障局5楼521室),联系电话:0631-7561527。   乳山市:乳山市人事考试中心(乳山市中苑街14号南栋2楼),联系电话:0631-6651690。   高区:高区就业和社会保障处专业技术人员管理科(威海市文化西路288号东附楼一楼6号窗口),联系电话:0631-5626013。   经区:经区人力资源服务办公室考试科(威海市青岛中路108-1号,经区政务服务大厅11号窗口),联系电话:0631-5985715。   临港区:临港区人力资源和社会保障局(威海市江苏东路1号临港区管委大楼6楼620室),联系电话:0631-5581881
2023-07-15 07:46:511

哪种女士香烟尼古丁最少?

ESSE(爱喜,韩国烟)又译爱昔 薄荷味入口清凉,比较经典的凉烟。ESSE(爱喜)是韩国的一种香烟,由韩国烟草人参公社出品,全球super slim销量第一。它是为女性消费者推出的低焦油混合型香烟,分为粉色普通型、蓝色特醇型和绿色薄荷型等类型,烟支纤长,其滤嘴采用最先进的激光打孔、侧流基技术,并且增添了烤烟精华素及自然精华素,用以减少吸阻、减轻刺激性及提高烟气烟香。爱喜是韩国烟草公司(KT&G)最具代表性的品牌之一,已经成为全球Super Slim销售第一的品牌,精心挑选烟叶精巧的混合,以满足您最大程度的愉悦,爱喜是低刺激柔和香烟的代表,高贵而又不失精致的烟支,社会精英的选择。爱喜也是一种非常具有女人味的香烟--长10厘米,直径0.5厘米(普通香烟长8.3厘米,直径0.8厘米),非常秀气,宛如水中的双鱼美眉,善良多情,惹人怜爱。
2023-07-15 07:46:532

威海福田人力资源跟哪个银行合作

为严格落实市委、市政府关于网络安全和信息化工作的相关要求,进一步防范网络攻击风险,全面提升我市人社信息化系统安全。12月23日,威海市人力资源和社会保障局与中国工商银行股份有限公司威海分行签订了信息安全服务合作协议。信息安全服务合作是在原有“社保+金融”业务合作的基础上,创新“人社+金融”合作模式,以新技术研究为切入点,充分利用中国工商银行安全攻防实验室力量,为威海市人力资源和社会保障局业务系统提供增值信息安全服务,通过技术交流、信息安全合作等方式,为双方数字化转型赋能业务发展打开新的合作空间。本次合作是威海市人力资源和社会保障局与中国工商银行股份有限公司威海分行深化合作空间、拓展合作领域的重大举措,也标志着双方在政银携手、优势互补、共谋发展上又迈出了坚实的一步。我们将以此次合作为新起点,依托自身优势,共同致力于服务民生、服务发展,实现“人社+金融”的创新应用拓展,在服务民生中谱写政企合作发展的新篇章
2023-07-15 07:46:591

英雄联盟ming去了哪里

Ming去哪里了,有后续了,简单梳理一下整个事件过程。1、RNG发布了2023年新赛季大名单,里面没有Ming2、粉丝发起灵魂追问Ming去哪里了3、疑似RNG工作人员“李三水水水水”发文说Ming去旅游了4、部分超话大V也发文说“不会丢”5、疑似Ming在群里回复,说自己目前处于“自由人阶段”,也一直和俱乐部保持友好沟通,谢谢大家关心6、知名爆料博主红姐也发表的看法:其实我跟r工作人员想法差不多,就是觉得ssm要是不留r,需要放弃太多东西,所以就算现在没签,那也是早晚的事。所以工作人员敢说ming没丢,那么ssm是不是会真的放弃大笔,和至少半个赛季,就为换一个真正的自由,但是ssm啥想法,谁也不知道。
2023-07-15 07:46:591

菲律宾买哪些品牌很便宜?

菲律宾的LEE的挺便宜的
2023-07-15 07:46:593

背景音乐问题就是那个mudukaqi.这歌叫什么

圣诞结 - 陈奕迅词:何启弘曲:李峻一我住的城市从不下雪记忆却堆满冷的感觉思念到忘记霓虹扫过喧哗的街把快乐赶得好远落单的恋人最怕过节只能独自庆祝尽量喝醉我爱过的人没有一个留在身边寂寞他陪我过夜Merry Merry Christmas Lonely Lonely Christmas想祝福不知该给谁爱被我们打了死结Lonely Lonely Christmas Merry Merry christmas写了卡片能寄给谁心碎的像街上的纸屑落单的恋人最怕过节只能独自庆祝尽量喝醉我爱过的人没有一个留在身边寂寞他陪我过夜Merry Merry Christmas Lonely Lonely Christmas想祝福不知该给谁爱被我们打了死结Lonely Lonely Christmas Merry Merry christmas写了卡片能寄给谁心碎的像街上的纸屑电话不接不要被人发现我整夜都关在房间缓缓的响声听来像哀悼的音乐眼眶的泪 温热冻结望着电视里的无聊节目躺在沙发上变成没知觉的植物Merry Merry Christmas Lonely Lonely Christmas想祝福不知该给谁爱被我们打了死结Lonely Lonely Christmas Merry Merry christmas写了卡片能寄给谁心碎的像街上的纸屑Merry Merry Christmas Lonely Lonely Christmas想祝福不知该给谁爱被我们打了死结Lonely Lonely Christmas Merry Merry christmas写了卡片能寄给谁心碎的像街上的纸屑谁来陪我过这圣诞节收起
2023-07-15 07:46:371

MING是什么意思

ming 是一位魔兽玩家,玩的是盗贼职业,他的言论有时候比较极端,所以惹来很多争议,但无可厚非的是,他对推动魔兽的进步起着积极的作用
2023-07-15 07:46:362

英语单词Valentine怎么记忆?

多背咯,不就一个单词吗
2023-07-15 07:46:347

r y r x h l h r d b d d c s z h d 这是拼音的首字母 但就是还没拼

ryrx若隐若现hlhr忽冷忽热dbdd得不到的cszhd才是最好的“若隐若现,忽冷忽热,得不到的才是最好的”
2023-07-15 07:46:311

为什么说梵卡奇是法国品牌

说梵卡奇是法国品牌的原因是梵卡奇是出自法国。梵卡奇是法国的品牌,做手工水晶杯的。梵卡奇Fankaqi梵卡奇手工水晶杯“将酒的美味与手工水晶杯的灵气相结合,品尝中,灵魂得到无尽的释放和轻松,仿佛置身于宁静无杂的第三空间”这就是“第三空间的品尝”,也是梵卡奇(Fankaqi)品牌价值观的真正主张。梵卡奇(Fankaqi)为健康、为品味、为了爱,一切都值得拥有来自梵卡奇手工水晶杯。
2023-07-15 07:46:301

大卫杜夫香烟[看图](白色的价格)这烟很有名气吗?

17~~~~~~~~~~~~~~
2023-07-15 07:46:304

Hydraulic wire braided hose process, pro and cons!这句化什么意思 谢谢

钢丝编织胶管水位过程,以及最残酷的迫害
2023-07-15 07:46:301

都有哪些字读ming

佲 mǐng 冥 míng 凕 mǐng 名 míng 命 mìng 姳 mǐng 慏 mǐng 明 míng 暝 míng 朙 míng 榠 míng 洺 míng 溟 míng 猽 míng 眀 míng 眳 míng 瞑 míng 茗 míng 蓂 míng 螟 míng 覭 míng 詺 míng 鄍 míng 酩 mǐng 铭 míng 铭 míng 鸣 míng 鸣 míng 嫇 míng,mǐng
2023-07-15 07:46:281

C++ FindOneOf() 的问题

CString str;int index = str.Find(".");if(index != -1){//有.时的处理}else{// 没有.时的处理}double d = atof(str.GetBuffer());
2023-07-15 07:46:253