作者归档:admin

并发的演变

Anant,我的读者之一,问了一个嘎嘎好的问题:是否可以详细说明多线程包括java 8中的相应改进的相关主题(从入门高阶)。他想要的就是从简单的Runnable接口到java 8最新特性的多线程演变过程,我今天就满足他。
我费了九牛二虎之力终于收集到了以下信息,如果哪里不太完善,请愉快的通知我(反正我也不改)。

JDK中的多线程概念

JDK1.x版本里只有很少的类出现。具体的接口/类如下:

  • java.lang.Thread
  • java.lang.ThreadGroup
  • java.lang.Runnable
  • java.lang.Process
  • java.lang.ThreadDeath
  • 以及一些异常类,例如
  1. java.lang.IllegalMonitorStateException
  2. java.lang.IllegalStateException
  3. java.lang.IllegalThreadStateException

除此之外还有一丢丢的同步集合,例如java.util.Hashtable
JDK 1.2和1.3 在多线程这块没什么显著改变(如果有什么出入请更正)
JDK 1.4,只有一点JVM层面关于单次(single call)调用挂起(suspend)/恢复(resume)多线程的改动
JDK 1.5 算是一个大的改动,它融入了多线程并发的各种辅助类:Executor,semaphore,mutex,barrier,latches,concurrent collections 以及 blocking queues,所有的这些都被包含在了这个版本中,java多线程应用云的巨大改变正是孕育于此。

完整的变更列表看这里:http://docs.oracle.com/javase/1.5.0/docs/guide/concurrency/overview.html

JDK 1.6 相比于API的升级更多的是平台的修复,因此在这个版本中出现了一些新的API
JDK 1.7 增加对ForkJoinPool的支持,ForkJoinPool通过实现工作-窃取(work-stealing)技术来打到最大吞吐量,Phaser类也被引入
JDK 1.8 你懂的 Lambda的引入,然而在并发这块仍然没有太大改动,只有2个接口和4个类引入到了java.util.concurrent包,比如CompletableFutureCompletionException
在java 8 中,为了增加基于新添加的stream功能和lambda表达式的聚合操作,集合框架经历了一次大的修订,因此大量方法被几乎全部引入到了Collection类中,也包括并发集合。

完整的变更列表看这里:http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/changes8.html

参考:

  • https://www.cs.princeton.edu/courses/archive/fall97/cs461/jdkdocs/relnotes/intro.html
  • http://programmers.stackexchange.com/questions/147205/what-were-the-core-api-packages-of-java-1-0
  • http://docs.oracle.com/javase/1.5.0/docs/guide/concurrency/overview.html
  • http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/changes7.html
  • http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
  • http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/changes8.html

希望上述列表能帮助你理解多线程特征的JDK版本指导
译者注:网友在评论区内的补充
1.7
TransferQueue, ConcurrentLinkedDeque, and ThreadLocalRandom

  • https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TransferQueue.html
  • https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadLocalRandom.html
  • https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html

无志者常立志

 无志者常立志就是说的我这种人吧,三十五岁,正好活在IT行业的坎上,高不成低不就,真心焦虑a啊,可除了努力仿佛也找不出更好的办法,那问题来了,努力的方向,未来人工智能技术将会更加普及,所以大方向还得跟上时代潮流啊,这是个中期目标,但是现在就得准备。

 短期目标就是的换工作,首选大厂,当然也有一些创业公司,但是像我这样上有老,下有小的人,真心的慎重啊,万一没挑好就衰了,毕竟没有年龄优势了。进大厂才更有机会在实战中接触到人工智能,但要注意,任何行业发展到成熟阶段必然走向细化,专业化,人工智能也不例外,所以即使选择人工智能,也得把握好方向,这个就因人而异了,我是更倾向于计算机视觉

 想进大厂就得刷题,想在短时间内快速提升,好像没有更好办法,因为国内认这个,如果你是大牛,随时ready,那最好,但我的水平连牛犊子都算不上

 给自己两个月时间,尽可能的多刷吧,暂定每天至少两道吧,贵在坚持。从今天开始我会把每天的任务放在计划的菜单下,并及时总结

2019-08-05 努力成为更好的自己

wordpress将文章发布到指定链接

刚开始玩wordpress,还不是很溜,首当其冲的是我想建立多个文章类型的页面,然后将不同类型的文章放到不同类型的链接(首页菜单)里。今天终于实现了,其实很简单,两步即可:
1. 点击后台的“文章”链接,添加你想创建的菜单,其实添加分类目录
2. 点击后台的“外观”-“顶部”-“菜单”-“顶部菜单”,然后点击“添加项目”按钮,会列出一些大的分类,然后再“分类目录”里就可以选择你刚创建的分类了
设置好以上两步后,你在创建文章时,可以选择分类,这样就发不到了不同的菜单了

git常用语法

1.获取指定tag对应的code:git checkout tags/you_tag - new_branch
示例:git checkout tags/9.0.6 -b fleet-0.1

2.merge branches
当你基于master创建自己的branch进行修改期间,master可能又有了新的更改,这时你可以选择将这些别人的更改merge到自己的branch,然后再一起提交。你可以执行以下命令:

切换到master并拉取最新代码,如果已经是最新的可以忽略

git checkout master
git pull

切换到你自己的分支

git checkout your-branch

将最新的master合并到你的分支

git merge master

Java多线程

Java多线程是一个复杂的话题,里面涉及到多种术语,编程模型以及一些操作系统层面的细节。要学好多线程除了数量掌握好这些理论知识,更重要的在于练习,编程世界唯一的捷径就是不断练习。

结合自己多年的编程经验,以及参考国内外一些著名的文章和书籍,我想试着带大家进入多线程那有趣而又富有挑战性的世界。其实写这些文章需要勇气,因为稍微不注意,或者由于自己的水平有限,就会误导读者,反而带来不好的影响,所以我想先以翻译国外一些高质量的文章开始,保证理论知识的准确性,让大家正确入门,然后再添加各种实战。千里之行始于足下,只要我们都能坚持下去,相信每个人都会有收获。好了,让我们开始吧。

简单来说,并发是一种能能并行运行多个程序,或同一程序不同部分的能力。利用底层操作系统和硬件锁蕴含的能力,并发可以使程序获得更高的性能和吞吐量。例如,现在的计算机拥有多个CPU以及一个CPU包含多核,程序可以利用多核来服务某一处理的特定部分。在java程序里,结合多线程来达到并行处理及并发。

什么让java拥有并发能力

首当其中的就是java.lang.Thread类,它是java中所有并发概念的基础,其次就是用java.lang.Runnable来抽象了线程类的行为。还有其他的一些用于构建高级应用类,这些类在java1.5时被引入,存在于java.util.concurrent中。

更多:java并发的演变

Java并发真的如此简单吗

上述描述让我们觉得并发确实不错,而且容易实现。然而并不是,它需要你很好的理解各种基本概念以及清楚的了解你应用程序的目标。
相比于单线程,并发线程拥有更复杂的设计。那些访问共享资源的代码在被多线程执行时需要格外注意,不正确的线程同步所引发的问题极难检测,重现以及修复。这些错误往往发生在更高的环境,例如生产环境,有时根本无法在较低环境中复现。
除此之外,运行这些程序需要更多的资源,所以请确保你拥有充足的资源。

Java并发系列

在一篇博文中覆盖所有的并发主题是不太可能的,所以在以下文章中将分开讨论不同的概念。你可以浏览这些主题,如果有什么问题和建议可以留言。
Java并发基础

  • 什么是线程安全
  • 对象级别锁和类级别锁
  • 比较和交换算法(CAS)
  • wait(),notify()以及notifyAll()

对比

  • 实现Runnable与继承Thread
  • 锁与监视器
  • yield()与join()
  • sleep()与wait()

Executro框架

  • Executor框架系列
  • ScheduledThreadPoolExecutor示例
  • FixedSizeThreadPoolExecutor示例
  • ThreadPoolExecutor示例
  • ThreadPoolExecutor + Callable + Future示例
  • 使用ThreadPoolExecutor和信号量限制任务提交率示例
  • BlockingQueue示例
  • UnCatchExceptionHandler示例

高级注意

  • ForkJoinPool示例
  • CountdownLatch示例
  • 使用信号量控制并发访问
  • BinarySemaphore
  • java.util.concurrent.locks.Lock
  • java.util.concurrent.ThreadFactory
  • ThreadLocal变量
  • 线程间通讯

并发集合

  • ConcurrentHashMap示例
  • ConcurrentLinkedDeque示例

其他

  • 创建和解决死锁