[关闭]
@linux1s1s 2019-02-21T15:26:47.000000Z 字数 4787 阅读 1800

Base Time-Java

Base 2016-12


系列博文
Base Time-Http Protocol
Base Time-Bitmap
Base Time-Database
Base Time-Java
Base Time-Design Patterns
Base Time-Java Algorithms

内存模型

后续补充,请参考Java内存模型

Files&IO

此处输入图片的描述

基本概念

举栗子

FF FE 8FDE 901A
前两个FF FE是标记,告诉电脑,这个文档的存储方式是unicode。
8FDE 是连
901A 是通
所以 每个汉字是 2个字节 (1个字节是8bit)

EF BB BF E8 BF 9E E9 80 9A
前三个EF BB BF 告诉电脑 这个文档是utf-8存储的。
E8 BF 9E 是连
E9 80 9A 是通
所以 每个汉字是 3个字节 (1个字节是8bit)

字节流

字节输入流
字节输出流

字符流

字符输入流
字符输出流

集合

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架。在平常的学习开发中,灵活熟练地使用这些集合框架,可以很明显地提高我们的开发效率,当然仅仅会用还是不够的,理解其中的设计思想与原理才能更好地提高我们的开发水平。

此处输入图片的描述

小结

更多细节请参考Java - 集合框架完全解析

多线程

线程状态图

此处输入图片的描述

synchronized, wait, notify

synchronized用法:

  1. public class Thread1 implements Runnable {
  2. Object lock = new Object();
  3. public void run() {
  4. synchronized(lock){
  5. ..do something
  6. }
  7. }
  8. }

这里锁住的明显是lock实例。

  1. public class Thread1 implements Runnable {
  2. public synchronized void run() {
  3. ..do something
  4. }
  5. }

这里锁住的是Thread1的实例,如果是static方法,则锁住的是该类的所有实例。

  1. /**
  2. * 生产者生产出来的产品交给店员
  3. */
  4. public synchronized void produce()
  5. {
  6. if(this.product >= MAX_PRODUCT)
  7. {
  8. try
  9. {
  10. wait();
  11. System.out.println("产品已满,请稍候再生产");
  12. }
  13. catch(InterruptedException e)
  14. {
  15. e.printStackTrace();
  16. }
  17. return;
  18. }
  19. this.product++;
  20. System.out.println("生产者生产第" + this.product + "个产品.");
  21. notifyAll(); //通知等待区的消费者可以取出产品了
  22. }
  23. /**
  24. * 消费者从店员取产品
  25. */
  26. public synchronized void consume()
  27. {
  28. if(this.product <= MIN_PRODUCT)
  29. {
  30. try
  31. {
  32. wait();
  33. System.out.println("缺货,稍候再取");
  34. }
  35. catch (InterruptedException e)
  36. {
  37. e.printStackTrace();
  38. }
  39. return;
  40. }
  41. System.out.println("消费者取走了第" + this.product + "个产品.");
  42. this.product--;
  43. notifyAll(); //通知等待去的生产者可以生产产品了
  44. }

这里锁住的是这两个方法所属的实例,记住锁只有作用在同样一个实例上才有作用,否则无效。

volatile

多线程的内存模型:main memory(主存)、working memory(线程栈),在处理数据时,线程会把值从主存load到本地栈,完成操作后再save回去(volatile关键词的作用:每次针对该变量的操作都激发一次load and save)。

此处输入图片的描述

典型使用场景

volatile最适用一个线程写,多个线程读的场合。
如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替。(摘自Netty权威指南)
疑问:如果只是赋值的原子操作,是否可以多个线程写?(答案:可以,但是一般没有这样的必要,即没有这样的应用场景)

最典型的适用场景

  1. volatile boolean shutdownRequested;
  2. ...
  3. public void shutdown() { shutdownRequested = true; }
  4. public void doWork() {
  5. while (!shutdownRequested) {
  6. // do stuff
  7. }
  8. }

反射

参考博文:
Java - 集合框架完全解析
java io系列01之 "目录"
Java IO最详解
随笔分类 - Java

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注