首页 > 编程语言 >Java(2) ----- 异常、多线程、同步安全、死锁、并发包、Lambda表达式、Stream流

Java(2) ----- 异常、多线程、同步安全、死锁、并发包、Lambda表达式、Stream流

时间:2024-03-30 16:24:18浏览次数:29  
标签:变量 Stream 对象 死锁 线程 内存 发包 多线程 方法

异常

方法默认都可以自动抛出运行时异常!

自定义异常:

(1)自定义编译时异常

1、定义一个异常类继承Exception

2、重写构造器

3、在出现异常的地方用throw new 自定义对象抛出

4、编译时异常是编译阶段就报错,提醒跟家强烈,一定需要处理!

(2)自定义运行时异常

1、定义一个异常类继承RunTimeException

2、重写构造器

3、在出现异常的地方用throw new 自定义对象抛出;

4、提醒不强烈,编译时异常;

异常的作用

1、可以处理代码问题,防止程序出现异常后的死亡

2、提高程序的健壮性和安全性;

多线程

并发编程、

什么是进程?程序是静止的,运行中的程序就是进程;

1、动态性:进程是运行中的程序,要动态的占用内存,CPU和网络等资源;

2、独立性:进程与进程之间是相互独立的,彼此有自己独立的内存区域;

3、并发性:假设CPU是单核,同一个时刻其实内存中只有一个进程被执行;

并行:同一个时刻同时有多个在执行;

什么是线程?

线程是属于程序的,一个进程包括多个线程;

线程是进程中的一个独立执行单元;

线程的作用:

大型高并发技术的核心技术;

线程创建方式1:

1、继承Thread类

2、重写run()方法

3、创建一个新的线程对象

4、调用线程对象的Start()方法启动线程;

继承Thread类的优缺点:

优点:编码简单;

缺点:线程类已经继承了Thread类无法继承其他类;

线程创建方式2:

1、创建一个线程任务类实现Runnable接口

2、重写run()方法

3、创建一个线程任务对象。

4、把线程任务对象包装成线程对象

5、调用线程对象的start()方法启动线程;

实现Runnable接口的优缺点:

缺点:代码复杂一些;

优点:

线程任务类只是实现Runnable接口,可以继续继承了其他类;

同一个线程任务对象可以被包装为多个线程对象;

适合多个多个线程去共享一个资源;

实现解耦操作,线程任务代码可以被多个线程共享,线程任务代码和线程独立。

线程池可以放入实现Runable和Callable现成任务对象;

 线程同步的做法:加锁

把共享资源进行上锁,每次只有一个线程进入访问资源;

在实例中,建议用this作为锁对象,此时this正好是共享资源;必须高度面向对象;

在静态方法中建议用类名.class字节码作为锁对象;

synchronized()

Lock()显示锁

lock.lock()

lock.unlock()

小结:线程安全性能差,线程不安全,性能好。

线程通信

案例:生产者与消费者模型,生产不能过剩,消费不能没有;

// 上锁;

public synchronized void fangfaming(){}

线程池

其实就是一个容纳多个线程的容器,其中的线程可以反复的使用,省去了频繁创建线程对象的操作,无序反复的创建线程,而消耗过多的资源;

1、降低资源消耗

2、提高响应时间

3、提高线程的可管理性;

callable做线程池的任务可以得到线程执行的结果;

死锁

面试题(一个必然死锁的案例):::代码题

 解:定义两个线程,并发执行;

 并发变量下的变量不可见问题

volatile关键字

目标:并发编程下,多个线程访问变量的不可见性问题

引入:多个线程访问共享变量,会出现一个线程修改变量的值后,其他的线程看不到最新值的情况;

变量不可见性内存语义

 JMM(Java Memory Model):Java内存模型,虚拟机定义的内存模型,屏蔽了底层不同计算机的区别;

共享变量都存在于主内存中,每一个线程启动,都存在工作内存,每一个线程通过JMM访问主内存中的共享内存,存储到工作内存中,产生共享变量副本;

 解决办法:   加一个锁:Synchronized,清空工作内存副本 ,再重新读取主内存中的工作内存;

      加一个volatile 关键词修饰;

volatile和Synchronized的区别

volatile只能修饰实例变量和类变量,而Synchronized可以修饰方法,以及代码块;

volatile保证了数据的可见性,但是不能保证原子性(多线程进行写操作,不保证线程安全);Synchronized是一种排他机制;

原子性

一批操作是一个整体,要么所有的操作都会成功,要么所有的操作都失败;

volatile只能保证线程间变量的可见性,但是不能保证变量操作的原子性;

原子性的保证:加锁

原子类:

原子性Integer,可以实现原子更新操作;从而实现线程安全!

加锁机制的性能价差;

原子类CAS(比较再交换)机制实现线程安全!是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。

CAS机制使用了三个机制:内存地址V,,。

 Lambda表达式

作用:核心目的是为了简化匿名内部类的代码写法;

 Lambda表达式不能简化所有匿名内部类的写法;只能简化函数式接口(FunctionalInterface)的匿名内部类写法;

  1、首先是接口;

  2、接口只有一个抽象方法;

 Lambda进一步的简化:

 Lambda表达式 方法引用

  采用“::”

方法引用的四种形式:

(1)静态方法的引用;

  被引用的方法的参数列表要和函数式接口中的抽象方法的参数列表一样;

(2)实例方法的引用;

  格式  对象::实例方法

(3)特定类型方法的引用;

  特定类型:String,任何类型;

  格式,特定类型::方法

(4)构造器引用;

  格式: 类名::new

Stream流

作用:用来解决已有集合/数组类库存在的弊端;

能解决的问题:

  1、用来解决已有集合/数组API存在的弊端;

  2、采用Stream流来简化集合与数组的操作;

Stream流的常用API

Stream流的加工方法

map():加工

concat():合并流

函数拼接与终结方法

终结方法:foreach和count

函数拼接:filter、limit、skip、map、concat

 收集Stream流:把Stream流的数据转化为集合;

stream的作用是:把集合转换成一根传送带,借用stream流的强大功能进行的操作。但是实际开发中数据最终的形式还是应该是集合,最终stream流操作完毕以后还是要转换成集合这就是收集stream流。

listname.collect(Collectors.toSet());

可以借助构造器引用申明转换为数组类型;

 Stream流 是手段,但是集合 才是最终目标;

标签:变量,Stream,对象,死锁,线程,内存,发包,多线程,方法
From: https://www.cnblogs.com/kuangmeng/p/18100190

相关文章

  • C#多线程编程详细教学
     在C#中,多线程编程是一种非常重要的技术,它允许程序同时执行多个任务,从而提高了应用程序的响应性和整体性能。本文将详细介绍C#中的多线程编程,包括基本概念、线程创建、线程同步以及相关的代码示例。一、基本概念线程是操作系统进行运算调度的最小单位,它被包含在进程之中,是......
  • 死锁(Dead Lock)
    概念死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力干涉那他们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁产生死锁的原因系统资源不足进程运行推进......
  • cnc数据采集 ,机床数据采集,设备联网,多品牌多线程采集驱动,融合马扎克、西门子、海德汉、
    +cnccaiji采集驱动可以对不同品牌的机床信息进行管理(ip、端口、采集点位、车间、工厂、设备名称、编号)等,将采集到的数据通过mqtt或者http推送到指定地址,实现和业务系统的完全解耦。对于不了解cnc采集相关业务的公司来讲非常的友好。驱动支持系统 马扎克马扎克MAZAKCNC数据采......
  • 【Linux】线程同步{死锁/线程同步相关接口/由浅入深理解线程同步}
    文章目录1.死锁1.1概念1.2死锁的必要条件2.线程同步相关接口2.1pthread_cond_init/destroy()2.2intpthread_cond_wait2.3linux下的条件变量及其作用2.4intpthread_cond_signal/broadcast();2.5Linux下阻塞和挂起的异同2.6阻塞,挂起,和进程切换的关系3.由浅入深理解线......
  • 2.4 死锁
    12345678910111213......
  • 线程池的介绍与实现(多线程代码案例)
    目录概念:ThreadPoolExecutorintcorePoolSizeintmaximumPoolsizelongkeepAliveTimeTimeUnitunitBlockingQueuewokrQueueThreadthreadFactoryRejectedExecutionHandlerhandler1.ThreadPoolExecutor.Abortpolicy2.ThreadPoolExecutor.CallerRunsPolicy3.Thre......
  • 异步VS多线程
    前段时间面试的时候被问到了异步和多线程的区别,回答的模棱两可,今天花时间系统的了解了下,如有错误,欢迎斧正~异步与多线程是在并发编程中两个比较关键的概念, 很容易弄混淆:异步编程(Asynchronous)概念:异步编程是并发编程的一种形式,即在程序运行逻辑中,一部分语句可以独立于主程序而......
  • 简易的取款多线程
    首先建立一个classAccount类,设置全局变量money,这个变量会被所有的线程使用。设置条件。classAccount{publicstaticintmoney=3000;//建立全局变量publicsynchronizedvoidtaking(intm){if(m>money){System.out.println("余额不足");}else{System.out.pr......
  • JAVAEE——多线程的设计模式,生产消费模型,阻塞队列
    文章目录多线程设计模式什么是设计模式单例模式饿汉模式懒汉模式线程安全问题懒汉模式就一定安全吗?锁引发的效率问题jvm的优化引起的安全问题阻塞队列阻塞队列是什么?生产消费者模型阻塞队列实现消费生产者模型可能遇到的异常多线程设计模式什么是设计模式首先我......
  • 【C++】Linux多线程开发
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录3.1线程概述3.2创建线程3.3、线程终止3.4连接已经终止线程3.5线程的分离3.6线程取消3.7线程属性3.8线程同步3.9互斥锁3.10死锁3.11读写锁3.12生产者和消费者模型3.13条件......