随笔分类 - Java 基础
摘要:UDP 基本流程: UDP发送端基本流程: 1、使用DatagramSocket 指定端口 创建发送端 2、准备数据 一定转成字节数组 3、 封装成DatagramPacket 包裹,需要指定目的地 4、发送包裹send(DatagramPacket p) * 5、释放资源 UDP接收端基本流程:
阅读全文
摘要:JDK提供的大多数内置锁都是可重入的,也就是 说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立 刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器 将会递减,当计数值等于0时,锁释放。如果没有可重入锁的支持,在第二次 企图获得锁时将会进入死锁状态。 现实中,我们
阅读全文
摘要:在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据。但是,当线程特别忙时,就不会去主内存读最新数据了。 在 java 的多线程中 volatile 主要是为了保证数据的可见性同步,是
阅读全文
摘要:指令重排是指:代码执行顺序和预期不一致。 代码运行一般步骤为: 1、从内存中获取指令解码 2、计算值 3、执行代码操作 4、把结果写回内存 而写回内存的操作比较耗时,CPU为了性能,可能不会等它完成,就进行对下一个指令解码计算。 发生指令重排是CPU为了提高性能,但必须是对结果不影响的情况,比如:
阅读全文
摘要:使用信号灯法实现生产消费者模式需要借助标志位。 下面以演员表演,观众观看电视为列,写一个demo 同一资源 电视: //同一资源 电视 class Tv { String voice; // 信号灯 // T 表示演员表演 观众等待 // F 表示观众观看 演员等待 boolean flag = t
阅读全文
摘要:多线程通过管程法实现生产消费者模式需要借助中间容器作为换从区,还包括生产者、消费者。下面以蒸馒头为列,写一个demo。 中间容器: 为了防止数据错乱,还需要给生产和消费方法加锁 并且生产者在容器写满的情况下需要等待消费者消费, 同理消费者在容器为空的情况下需要等待生产者生产 //缓冲区 class
阅读全文
摘要:在java 多线程中 过多的同步造成相互不释放资源 从而相互等待,造成死锁线现象,一般发生于同步中持有多个对象锁 如以下代码: public class DeadLock { public static void main(String[] args) { WuDao wd1 = new WuDao
阅读全文
摘要:先看一个经典的12306案例: public class SynBlockTest { public static void main(String[] args) { // 一份资源 SynWeb12306 web = new SynWeb12306(); // 多份代理 new Thread(w
阅读全文
摘要:jdk 8 开始 java 引入了lambda 表达式。 lambda适用场景: 1、接口或父类 2、接口或父类只有一个方法 我们从多线程写法来推导一下: 1、外部类写法: package com.xzlf.thread; /** * Lambda 表达式推导一:外部类 * @author xzlf
阅读全文
摘要:我们使用 java 多线程时,都需要通过线程代理对象来启动线程,常见的写法: new Thread(target).start(); 这在设计模式中叫静态代理模式,静态代理模式组成; 1、公共接口 2、真实角色 3、代理角色 以结婚为例,结婚要找婚庆公司,结婚前和结婚后的事情交给婚庆公司处理,你只要
阅读全文
摘要:完整套路 java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值。 基本套路: 1. 创建目标对象 2. 创建执行服务 3. 提交执行 4. 获取结果 5. 关闭服务 6. 继续方式一的下载图片,改写一下: 1
阅读全文
摘要:由于java是单继承,很多时候为了实现多线程 通过继承 Thread 类后,就不能再继承其他类了。为了方便可以通过实现 Runnable 接口来实现,和Tread 类似需要重写run 方法。 下面通过模拟12306 黄牛抢票来简单应用: public class Web12306 implement
阅读全文
摘要:java 通过继承Thread类实现多线程很多简单: 只需要重写run方法即可。 比如我们分三个线程去京东下载三张图片: 1、先写个下载类: 注意导入CommonsIO 包 public class WebDownLoad { public void download(String url, Str
阅读全文
摘要:RandomAccessFile 相对其它流多了一个seek() 方法指定指针的偏移量。 1、指定起始位置读取剩余内容 public static void test01() throws IOException { RandomAccessFile raf = new RandomAccessFi
阅读全文
摘要:在java IO 流中我们经常看到这样的写法: ObjectOutputStream oos = new ObjectOutputStream( new BufferedOutputStream(new FileOutputStream("obj.ser"))); 这其实就是IO流使用装饰设计模式,
阅读全文
摘要:DataOutputStream 和 ObjectOutputStream的共同点是: 1、写出后读取 2、读取顺序和写出一致 数据流操作: // 写入 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStrea
阅读全文
摘要:java 中 转换流是以字符流的形式操作字节流,需要注意一下两点: 1、操作内容必须是纯文本 2、指定字符集避免乱码 操作控制台输入输出: try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); B
阅读全文
摘要:IO流的操作写多了,会发现都已一样的套路,为了使用方便我们可以模拟commosIo 封装一下自己的FileUtils 工具类: 1、封装文件拷贝: 文件拷贝需要输入输出流对接,通过输入流读取数据,然后通过输出流写出数据,封装代码如下: /** * 对接输入输出流 * * @param is * @p
阅读全文
摘要:字节数组流输于缓冲流,放在jvm内存中,java可以直接操作。我们使用时可以不用关闭,交给GC垃圾回收机制处理、 当然我们为了保持良好习惯和代码一致性也可以加上关闭语句。 当其实我么打开ByteArrayInputStream 和 ByteArrayOutputStream 源码可以发现字节数组里的
阅读全文
摘要:IO流操作套路: 1、创建源; 2、选择流; 3、操作; 4、释放资源 上代码: package com.xzlf.io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; im
阅读全文

浙公网安备 33010602011771号