synchronized用法

Java多线程基础——Lock类

独自空忆成欢 提交于 2020-01-25 07:29:32
Java多线程基础——Lock类 转自:https://www.cnblogs.com/qifengshi/p/6354890.html 之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信。在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。 Lock类是Java类来提供的功能,丰富的api使得Lock类的同步功能比synchronized的同步更强大。本文章的所有代码均在 Lock类例子的代码 本文主要介绍一下内容: Lock类 Lock类其他功能 Condition类 Condition类其他功能 读写锁 Lock类 Lock类实际上是一个接口,我们在实例化的时候实际上是实例化实现了该接口的类 Lock lock = new ReentrantLock(); 。用synchronized的时候,synchronized可以修饰方法,或者对一段代码块进行同步处理。 前面讲过,针对需要同步处理的代码设置对象监视器,比整个方法用synchronized修饰要好。Lock类的用法也是这样,通过Lock对象lock,用 lock.lock 来加锁,用 lock.unlock 来释放锁。在两者中间放置需要同步处理的代码。 具体的例子如下

java笔记整理

我与影子孤独终老i 提交于 2020-01-10 03:48:31
基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 post请求的区别 Interface 与 abstract 类的区别 IOC的优点是什么 IO 和 NIO的区别,NIO优点 Java 8 / Java 7 为我们提供了什么新功能 什么是竞态条件? 举个例子说明。 JRE、JDK、JVM 及 JIT 之间有什么不同 MVC的各个部分都有那些技术来实现?如何实现? RPC 通信和 RMI 区别 什么是 Web Service(Web服务) JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制 简单说说你了解的类加载器。是否实现过类加载器 解释一下什么叫AOP(面向切面编程) 请简述 Servlet 的生命周期及其相关的方法 请简述一下 Ajax 的原理及实现步骤 简单描述Struts的主要功能 什么是 N 层架构 什么是CORBA?用途是什么 什么是Java虚拟机

Java 多线程基础

ⅰ亾dé卋堺 提交于 2020-01-07 13:18:39
Java 多线程基础 Java使用多线程进行并发编程。 一、进程、线程、协程、守护线程 进程 : 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。 线程 : 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 协程: 协同线程,某个线程为主线程,其他线程辅助它。主线程结束,辅助线程直接结束。主线程存活,其他线程才可以执行任务,类似于java中的守护线程。 守护线程: Java使用多线程并发,也有守护线程的辅助。 状态: 线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。 优先级: 线程之间也有优先级,优先级高的先执行(并非绝对)。 线程竞争资源,执行结果不确定,优先级也不一定靠谱,每次执行由cpu调度资源。 可以通过加锁进行人为控制。 二、Java创建线程 Java创建线程的方法有三种,一种是继承Thread类,另外一种是实现Runable接口,最后一种不谈。 1、继承Thread类创建线程 重写run()方法、使用start()方法开启线程。 //继承Thread类实现多线程 public class ThreadDemo

JAVA--高级基础开发

流过昼夜 提交于 2019-12-04 23:04:47
Day06【线程】 第一章 1.1 线程的基本概念 我们在之前,学习的程序在没有跳转语句的前提下,都是由上而下依次执行,只能做一件事 情,这样的程序我们也称为单线程程序;那么如果想要设计一个程序,边写代码边听歌,怎么设计呢?要解决上述问题,咱们得使用多进程或者多线程来解决。 并行:指两个或多个事件在同一时刻发生。(同时发生)。 并发:指两个或多个事件在同一个段时间内发生。 在操作系统中,安装了多个程序,并发指的是在一段时间内,宏观上有多个程序同时运行,这在CPU系统中,每一时刻只能有一个程序在执行,微观上这些程序是分时交替运行,只不过给人感觉是同时运行的,那是因为分时交替运行的时间是非常短的。 而在多个CPU操作系统中,则这些可以并发执行的程序可以分配到多个处理器上(CPU),实现多个任务并行执行,即利用每个处理器来处理一个可以并发执行的程序,这样就可以完成多个程序同时执行,目前电脑市场上说的多核CPU,便是多核处理器,核数越多,并行处理的程序就越多,能大大提高电脑运行的效率。 [注意] 单核处理器的计算机肯定是不能并行处理多个任务的,只能是多个任务在cpu上并发运行,同理,线程也是一样的,从宏观角度上理解,线程是并行运行的,但是从微观角度上理解,线程是串行运行的,即一个线程一个线程的去运行,当系统只用一个cpu时,线程会以某种顺序执行多个线程,我们把这种情况叫做线程调度。 1.2

Java并发:线程安全与锁优化

时间秒杀一切 提交于 2019-12-01 11:07:08
概述 人们很难想象现实中的对象在一项工作进行期间,会被不停地中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情。有时候,良好的设计原则不得不向现实做出一些让步,我们必须让程序在计算机中正确无误地运行,然后再考虑如何将代码组织得更好,让程序运行更快。对于“高效并发”来说,首先需要保证并发的正确性,然后在此基础上实现高效。 1.线程安全 《Java Concurrency In Practice》的作者Brian Goetz对“线程安全”有一个比较恰当的定义:“当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的”。 这个定义比较严谨,它要求线程安全的代码都必须具备一个特征:代码本身封装了所有必要的正确性保障手段(如互斥同步等),令调用者无须关心多线程的问题,更无须自己采取任何措施来保证多线程的正确调用。这点听起来简单,但其实并不容易做到,在大多数场景中,我们都会将这个定义弱化一些,如果把“调用这个对象的行为”限定为“单次调用”,这个定义的其他描述也能够成立的话,我们就可以称它是线程安全了。 1.1 Java语言中的线程安全 按照线程安全的“安全程度”由强至弱来排序

JAVA面经整理

佐手、 提交于 2019-12-01 07:53:37
一、Java SE ❤1、Java基础 1、一个十进制的数在内存中是怎么存的? Java支持的数据类型有哪些?什么是自动拆装箱? int 和 Integer 有什么区别 ? 什么时候使用int 什么时候使用Integer? 2、==比较的是什么? 3、hashCode()和equals()方法有什么联系? 为什么重写equals还要重写hashcode? Object若不重写hashCode()的话,hashCode()如何计算出来的?若对一个类不重写,它的equals()方法是如何比较的? 4、一个十进制的数在内存中是怎么存的? 5、Java语言中float和double数据类型的精度是多少?它们在内存中是怎么存储的?和Decimal有什么区别? 6、为啥有时会出现4.0-3.6=0.40000001这种现象? 7、不借助四则运算如何实现加法 8、char可以存汉字吗,底层怎么存的 9、Java的字符集是什么 10、什么是值传递和引用传递? 11、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList? 12、StringBuilder 和StringBuffer的区别 ? 底层实现上呢? 13、String为什么要设置成final类型?String是不变的吗?String为什么不可变?怎么实现不变的? 14、&和&&的区别?

Java多线程详解

不打扰是莪最后的温柔 提交于 2019-11-28 05:17:39
线程对象是可以产生线程的对象。比如在 Java 平台中Thread对象,Runnable对象。线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。相比于多进程,多线程的优势有: (1)进程之间不能共享数据,线程可以; (2)系统创建进程需要为该进程重新分配系统资源,故创建线程代价比较小; (3)Java语言内置了多线程功能支持,简化了java多线程编程。 一、创建线程和启动 (1)继承Thread类创建线程类 通过继承Thread类创建线程类的具体步骤和具体代码如下: • 定义一个继承Thread类的子类,并重写该类的run()方法; • 创建Thread子类的实例,即创建了线程对象; • 调用该线程对象的start()方法启动线程。 class SomeThead extends Thraad { public void run() { //do something here } } public static void main(String[] args){ SomeThread oneThread = new SomeThread(); 步骤3:启动线程: oneThread.start(); } (2)实现Runnable接口创建线程类 通过 实现Runnable接口创建线程类

Java面试宝典

坚强是说给别人听的谎言 提交于 2019-11-27 03:24:37
相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点: 可替换性:多态对已存在代码具有可替换性. 可扩充性:增加新的子类不影响已经存在的类结构. 接口性:多态是超累通过方法签名,想子类提供一个公共接口,由子类来完善或者重写它来实现的. 灵活性: 简化性: 代码中如何实现多态 实现多态主要有以下三种方式: 1. 接口实现 2. 继承父类重写方法 3. 同一类中进行方法重载 虚拟机是如何实现多态的 动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法. 接口的意义 接口的意义用三个词就可以概括:规范,扩展,回调. 抽象类的意义 抽象类的意义可以用三句话来概括: 为其他子类提供一个公共的类型 封装子类中重复定义的内容 定义抽象方法,子类虽然有不同的实现,但是定义时一致的 ## 接口和抽象类的区别 比较 抽象类 接口 默认方法 抽象类可以有默认的方法实现 ,java 8之前,接口中不存在方法的实现. 实现方式 子类使用extends关键字来继承抽象类.如果子类不是抽象类,子类需要提供抽象类中所声明方法的实现. 子类使用implements来实现接口

Java线程间通信

落花浮王杯 提交于 2019-11-27 03:14:30
前言 最近在看《Java多线程核心编程技术》这本书,没几天,但是看了很多章节。书中内容大都以代码为主,作者的想法大概是以代码的形式给读者增加多线程的印象,很多知识点也都以代码的形式展现,所以代码的篇幅占据了很大一部分,重点介绍的知识点也较少,整体偏简单了,我也很快的浏览了几个章节,做了大部分的笔记,其实还是有收获吧,就是感觉偏重基础,过多的代码量减少了总结,而且更深层次的原理性内容没有写出来,有点遗憾,所以后续我打算换一本书继续看。 本篇文章也是根据书中章节的介绍做的一次读书笔记,功能点都较简单,希望后续有机会能够再深入的了解一下这方面的知识点,本次就算抛砖引玉吧。 目标 本篇读书笔记大概介绍了以下几方面的内容: 使用wait/notify实现线程间的通信 生产者/消费者模式的实现 方法join的使用 线程与线程之间不是相互独立的个体,它们彼此之间可以相互通信和协作。 等待 / 通知机制的实现 方法wait()的作用是使当前执行代码的线程进行等待, wait()方法是Object类的方法 ,该方法用来将当前线程置入“预执行队列”中,并且在wait()所在的代码行处停止执行,知道接到通知或被中断为止。 在调用wait()方法之前,线程必须要获得该对象锁 , 即只能在同步方法或者同步块中调用wait()方法 。在执行wait()方法后,当前线程释放锁。在从wait()方法返回前