java5条件阻塞Condition的应用-多路等待通知Lock-Condition使用-笔记整理10

Java面试30天突击:从八股文到AI大模型应用的全栈攻略 在Java后端开发领域,构建完整的知识体系是应对技术面试和工程实践的核心。其原理在于将计算机科学的基础概念(如数据结构、并发模型、内存管理)与分布式系统设计原则相结合,形成解决复杂问题的能力框架。这一技术价值体现在能够设计高可用、可扩展的系统架构,并高效处理实际业务场景中的性能与一致性挑战。随着技术演进,应用场景已从传统的Web服务扩展到需要集成AI能力(如大模型应用)的智能系统。本文聚焦于Java面试准备,提供一份为期30天的系统性学习路径,特别涵盖了当前热门的AI大模型应用开发(如Spring AI集成 阅读详情

java5条件阻塞Condition的应用

Condition的功能类似在传统线程技术中的Object.wait和Object.notify的功能。在等待Condition时,允许发生”虚假唤醒”,这通常作为对基础平台语义的让步。对于大多数应用程序,这带来的实际影响很小,因为Condition应该总是在一个循环中被等待,并测试正在等待的状态声明。某个实现可以随意移除可能的虚假唤醒,但建议应用程序程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。

一个锁内部可以有多个Condition,即有多路等待和通知,可以参看jdk1.5提供的Lock与Condition实现的可阻塞队列的应用案例,从中除了要体会算法,还要体会面向对象的封装。在传统的线程机制中一个监视对象上只能由一路等待和通知,要实现多路等待和通知,必须嵌套使用多个同步监视器对象。(如果只用一个Condition,两个放的都在等,一旦一个放的进去了,那么它通知可能会导致另一个放接着往下走。)


大纲:

(1)用面试宝典中的子线程循环10次和主线程循环5次,两者交替运行50的例子进行讲解。 

(2)参考jdk文档中,Condition对象api中官方给了一种多路等待的阻塞队列代码 

 (3)在子线程和主线程交替循环时候,再加入一个线程,3个线程间交替执行,1执行完通知2,2执行完通知3,3执行完通知1(使用多个Condition来解决多路等待通知)


(1)用面试宝典中的子线程循环10次和主线程循环5次,两者交替运行50的例子进行讲解。

传统方式,使用synchronized来实现线程间互斥,Object自带的this.wait()、this.notify()实现线程间互斥

Jdk1.5之后使用Lock的lock()、unlock()方法实现线程间互斥,Lock.newCondition()的await()、signal()方法来实现线程间的同步


代码示例1:传统方式,使用synchronized来实现线程间互斥,Object自带的this.wait()、this.notify()实现线程间互斥

public class TraditionalThreadCommunication2 {

	public static void main(String[] args) {
		final Business business = new Business();
		new Thread(
				new Runnable() {
					@Override
					public void run() {
						for(int i=1;i<=50;i++){
							business.sub(i);
						}
					}
				}
		).start();
		
		for(int i=1;i<=50;i++){
			business.main(i);
		}
		
	}

}
  class Business {
	  
	  private boolean bShouldSub = true;
	  public synchronized void sub(int i){
		  while(!bShouldSub){
			  try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		  }
			for(int j=1;j<=10;j++){
				System.out.println("sub thread sequence of " + j + ",loop of " + i);
			}
		  bShouldSub = false;
		  this.notify();
	  }
	  
	  public synchronized void main(int i){
			  while(bShouldSub){
			  		try {
						this.wait();
			  		} catch (InterruptedException e) {
						e.printStackTrace();
					}
			  	}
				for(int j=1;j<=100;j++){
					System.out.println("main thread sequence of " + j + ",loop of " + i);
				}
				this.notify();
				bShouldSub = true;
	  }
  }


代码示例2:Jdk1.5之后使用Lock的lock()、unlock()方法实现线程间互斥,Lock.newCondition()的await()、signal()方法来实现线程间的同步

注意使用的是:condition的await()、signal()方法。而不是wait()、notify()方法,这俩个方法都是Object对象中的,是每个对象都有的,要用condition对象自由的等待、唤醒方法。

遇到过一个问题,为什么要将线程的等待,唤醒方法用放到Object祖先类中?

考虑到,所有的类都会被用到锁对象,结合synchronized的原理,其内部都是一个锁对象和一个监听(condition)对象.

                在使用synchronized关键字,其默认的锁对象和监听对象默认是同一个。在synchronized中使用唤醒、等待方法,要使用所对应锁对象的wait()、notify()方法。

 在使用的锁对象代码块中,使用的等待、唤醒方法 不是锁对象对应的监听对象的方法,会报错误:java.lang.IllegalMonitorStateException



public class TraditionalThreadCommunication {

	public static void main(String[] args) {
		
		final Business business = new Business();
		new Thread(
				new Runnable() {
					@Override
					public void run() {
						for(int i=1;i<=50;i++){
							business.sub(i);
						}
					}
				}
		).start();
		
		for(int i=1;i<=50;i++){
			business.main(i);
		}
		
	}

}
  class Business {
	  Lock lock=new ReentrantLock();
	  Condition condition=lock.newCondition();
	  
	  private boolean bShouldSub = true;
	  
	  public void sub(int i){
		  lock.lock();
		  try {
			  while(!bShouldSub){
				  try {
					condition.await();
				  } catch (InterruptedException e) {
					e.printStackTrace();
				  }
			  }
				for(int j=1;j<=10;j++){
					System.out.println("sub thread sequence of " + j + ",loop of " + i);
				}
			  bShouldSub = false;
			  condition.signal();
		  } finally {
				lock.unlock();
		  }
  
     }
	  
	  public  void main(int i){
		  lock.lock();
		  try {
			  while(bShouldSub){
			  		try {
						//this.wait();
						condition.await();
			  		} catch (InterruptedException e) {
						e.printStackTrace();
					}
			  	}
				for(int j=1;j<=100;j++){
					System.out.println("main thread sequence of " + j + ",loop of " + i);
				}
				bShouldSub = true;
				condition.signal();
				
		  } finally {
			lock.unlock();
		  }
	  }
}



(2)参考jdk文档中,Condition对象api中官方给了一种多路等待的阻塞队列代码 

通过俩个Condition对象来操作缓冲阻塞队列里的数据,

在存放数据的方法中,通过notFull(Condition)来控制操作线程等待,唤醒 取数据 线程

在取数据的方法中,通过notEmpty(Condition)来控制操作线程等待,唤醒 存数据 线程

如果只使用一个Condition来控制线程间的存取,线程之间的唤醒是随机唤醒,如果唤醒的都是取线程(或读线程)会产生死锁

class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 

   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length) 
         notFull.await();
       items[putptr] = x; 
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();
     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0) 
         notEmpty.await();
       Object x = items[takeptr]; 
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   } 
 }

 (3)在子线程和主线程交替循环时候,再加入一个线程,3个线程间交替执行,1执行完通知2,2执行完通知3,3执行完通知1(使用多个Condition来解决多路等待通知)

通过3个 Condition 和 shouldSub的三个状态 是来同步线程间的等待唤醒次序关系

public class TreeConditionCommunication {

	public static void main(String[] args) {
		
		final Business business = new Business();
		new Thread(
				new Runnable() {
					
					@Override
					public void run() {
					
						for(int i=1;i<=50;i++){
							business.sub2(i);
						}
						
					}
				}
		).start();
		new Thread(
				new Runnable() {
					
					@Override
					public void run() {
					
						for(int i=1;i<=50;i++){
							business.sub3(i);
						}
						
					}
				}
		).start();
		
		for(int i=1;i<=50;i++){
			business.main(i);
		}
		
	}


  static class Business {
	  private int shouldSub = 1;
	   Lock  lock = new ReentrantLock();
	  Condition condition1 = lock.newCondition();
	  Condition condition2 = lock.newCondition();
	  Condition condition3 = lock.newCondition();
	  public  void sub2(int i){		  
		  
		  lock.lock();
		  try{
		  while(shouldSub!=2){
			  try {
				condition2.await();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		  }
			for(int j=1;j<=10;j++){
				System.out.println("sub2 thread sequence of " + j + ",loop of " + i);
			}
		  shouldSub = 3;
		  condition3.signal();
		  }
		  finally{
			   lock.unlock();
		  }
		 
	  }
 public  void sub3(int i){		  
		  
		  lock.lock();
		  try{
		  while(shouldSub!=3){
			  try {
				condition3.await();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		  }
			for(int j=1;j<=20;j++){
				System.out.println("sub3 thread sequence of " + j + ",loop of " + i);
			}
		  shouldSub = 1;
		  condition1.signal();
		  }
		  finally{
			   lock.unlock();
		  }
		 
	  }
	  public  void main(int i){
		  try{
			  lock.lock();
		  	while(shouldSub!=1){
		  		try {
					condition1.await();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		  	}
			for(int j=1;j<=100;j++){
				System.out.println("main thread sequence of " + j + ",loop of " + i);
			}
			shouldSub =2;
			condition2.signal();
		  }
		  finally{
			  lock.unlock();
		  }
	  }
  }
}




腾讯四大方向面经汇总:前端、Java、C++、Go全解析 技术面试的底层逻辑,往往藏在各语言、框架的表象之下。无论是浏览器渲染机制、JVM内存模型、C++的RAII与移动语义,还是Go的GMP并发调度,大厂面试官真正考察的都是候选人“理解原理并落地决策”的能力。并发编程、性能优化、容器与数据结构这些高频考点,在不同技术栈中呈现出共通的考察维度——从基础八股到项目深挖,从手写代码到方案选型,每轮面试都在验证你能否在复杂工程中做出正确取舍。本文基于真实面试经历,完整复盘腾讯前端、Java、C++、Go四个方向的核心题目、追问链与答题思路,并横向对比各方向考察重点,提炼 阅读详情

相关推荐

Java面试进阶:从八股文到场景化解决方案的实战指南

在软件开发领域,扎实的计算机基础知识是构建复杂系统的基石。理解数据结构、算法、操作系统和网络原理,是高效解决工程问题的前提。随着互联网业务规模扩大,高并发、高性能和系统稳定性成为核心技术价值,这要求开发者不仅掌握语言特性,更要深入理解底层机制,如JVM内存管理、并发编程模型和数据库优化原理。这些技术广泛应用于电商、金融、社交等需要处理海量请求和数据的业务场景。本文聚焦于Java技术栈,探讨如何将核心知识体系与高频的**场景设计题**和**系统设计题**相结合,帮助开发者构建应对真实业务挑战的解决方案能力,从

weixin_30940783的博客 391

Lock中的Condition

Lock +Conditon 与synchronized对比 我们经常会将Lock与synchronized作比较,不过大多数人都是针对性能方面的对比,但其实Lock和synchronized的区别远不止性能上的区别,如果你的了解也仅限于此,那么这篇文章对你来说有很有意义,在了解Lock和Condition前强烈建议你先到上一篇了解synchronized的实现原理。 相同的设计模型 不管是Lock 还是synchronized都是基于管程模型设计的,所以它们的实现互斥、同步的思路都一样,管程是解

m0_53077601的博客 5125

【信息科学与工程学】计算机科学与自动化——第八十一篇 Java分布式软件高并发/高可用算法01

4. 消息队列(如Kafka的Topic分区,本质是范围)。3. 若是ACCEPT事件,bossGroup线程接受连接,创建SocketChannel,并将其注册到workerGroup的一个EventLoop的Selector上,关注READ事件。1. 分布式缓存分片(如Redis Cluster)。4. 分布式文件存储(如Ceph CRUSH)。6. 调用栈的模拟(如协程)。3. 服务网格(如Istio)的基础。2. 本地缓存与集中式缓存(如Redis)的一致性维护。3. 静态数据(如配置)缓存。

weixin_49199313的博客 1228

Lock锁与Condition详解

目录引子重新认识Lock接口你了解Condition接口吗Condition接口与示例Condition如何实现 引子 三个线程分别打印A、B、C,要求按ABC的顺序循环打印10次。 ReentrantLock和Conditon实现 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; pub

7me 6717

Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

Polyworks脚本开发学习笔记(十五)-利用Python连接Polyworks的COM组件

qq_43662503的博客 2501

使用WSL2安装ubuntu系统并配置深度学习环境

wsl2安装ubuntu部署深度学习环境的方法

u013358093的博客 2701

java多线程---显示锁Lock&Condition的使用

到了这里,就可以理解什么是显式,什么是隐式的,显式就是加锁和释放锁,是用户代码课操控的,而隐式就是一个标记,加索和释锁为jvm来处理。 lock是1.5推出的,并不是取代synchronized的,而是带来了更多的特性,synchronized是在1.6进行升级的。 一, 基本使用 它为什么推出呢?这里就要涉及到synchronized的缺点 我们直到syn...

阿七 2002

华为OD机试双机位C卷-几何平均值最大子数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)2026双机位C卷 【几何平均值最大子数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【几何平均值最大子数组】。

qq_45776114的博客 1367

【并发编程】Condition条件锁源码详解

想学习Java条件锁的小伙伴必看,本文将带你深入了解Condition条件锁底层原理,详细刨析Condition的数据结构、newCondition()方法、await()方法、signal()方法底层实现,带你逐行阅读分析源码。一篇文章让你彻底搞懂Condition条件锁。...

小七的博客 1526

uni-app开发-第3篇:uni-app 页面与路由

本文详细介绍了 uni-app 中的页面开发与路由管理。首先,页面是应用的基础单元,创建页面时需在pages目录下新建文件夹和.vue文件,页面结构由<template>、<script>和<style>三部分组成。uni-app 页面生命周期函数包括onShow、onReady、onHide和onUnload,分别用于处理页面显示、渲染完成、隐藏和卸载时的逻辑。其次,路由管理通过pages.json文件配置页面路径和样式,并提供uni.navigateTo等方法进行路由

无 415

从 PI Start Page 到 ESR、ID、SLD,重新理解 SAP PI 的工具访问体系

摘要 SAP PI工具入口设计反映了系统核心分工逻辑。不同角色通过特定入口访问专属工具:集成顾问使用Enterprise Services Builder设计接口,BASIS管理员通过SAP NetWeaver Administrator监控运行状态,技术顾问在Integration Builder配置路由,系统维护则需进入System Landscape Directory。这种设计体现了PI平台将工作划分为管理、技术配置、设计、业务配置和监控五大领域。尤其值得注意的是技术配置与业务配置的连续性关系,如I

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1870

Lock.newCondition()

【代码】Lock.newCondition()

m0_53271024的博客 676

SOI LDMOS器件的Sentaurus TCAD建模与关键电学特性仿真研究

本文研究了SOI LDMOS器件的TCAD建模与电学特性仿真。通过Sentaurus TCAD平台建立了单RESURF结构的SOI LDMOS模型,详细阐述了器件结构原理和RESURF耐压机制。研究采用SDE进行几何定义和掺杂配置,在Sentaurus Device中构建了完整的物理模型体系,包括迁移率、复合和碰撞电离模型。通过系统仿真提取了器件的转移特性、输出特性和击穿特性等关键参数,分析了各参数对性能的影响规律。研究结果为功率半导体器件的仿真建模提供了规范化参考,有助于优化SOI LDMOS的性能设计。

huanghm88的专栏 134

Java基础核心考点深度解析:Android面试必备与实战应用

Java作为Android开发的基石语言,其核心原理深刻影响着应用性能与稳定性。理解Java内存模型(JMM)和垃圾回收(GC)机制,是解决内存泄漏和优化程序运行效率的关键。在并发编程中,掌握线程池、锁机制及原子类,能有效提升多线程任务的管理能力与数据安全性。这些基础概念直接映射到Android开发场景,例如Handler的内存泄漏防范、RecyclerView数据源的高效管理,以及全局缓存的多线程安全设计。本文聚焦HashMap、ConcurrentHashMap等集合框架的演进与差异,并深入剖析sync

weixin_30861459的博客 346

AI上推荐 之 隐语义模型(LFM)和矩阵分解(MF)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 1万+

爬虫瑞数5案例:联通

瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。

老衲爱洗头的博客 4470

Java最高频八股文速通

final 类:String 类被声明为 final,这意味着它不能被继承,从而防止了通过继承改变其行为。final 字段:String 类中的 value 字段是 final 的,这保证了 String 对象在创建后其内部字符数组不会被改变。没有提供修改方法:String 类没有提供任何可以修改其内容的方法。所有对 String 的操作(如拼接、替换等)都会生成一个新的String 对象。

qq_43751506的博客 6395

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

知识总结 - 常见问题

1. InnoDB存储引擎,三层B+树,单表能存储多少数据MySQl存储单元为1页,1页为16K,即16384Byte非叶子节点存储单元为主键+指针,大小为8+6=14Byte单页可存储16384/14 ≈ 1170个单元,即可存储1170个子节点每个存储单元可标记1页,则前两层可标记1170x1170页第三层叶子节点存储数据,每条数据约1K,单页则可存储16/1=16个数据三层 B+树,单表可存数据约为1170x1170x16=21902400条数据。

yuyehui的博客 834

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++从零构建网盘系统:Socket、协议设计、断点续传与高并发优化

网络编程是构建分布式系统的基石,其核心在于理解数据如何在网络中可靠传输。TCP/IP协议栈提供了端到端的通信保障,而应用层协议设计则决定了服务的具体形态与效率。掌握Socket编程、I/O多路复用及并发模型,对于开发高性能服务器具有极高的技术价值,广泛应用于即时通讯、文件传输和云计算存储等场景。本文以C++实现一个支持多用户和断点续传的网盘系统为例,深入探讨了从定义二进制协议、处理TCP粘包拆包,到实现文件分块上传和利用SQLite管理元数据等关键技术细节。通过将业务逻辑与网络I/O解耦,并引入线程池处理计

weixin_33976072的博客 326

Java后端面试核心:从八股文到实战的系统复习指南

Java 后端面试准备,尤其是应对“八股文”式的技术考察,是一个系统工程。它不仅仅是背诵知识点,更是对技术原理、应用场景和问题排查能力的综合检验。很多开发者面对海量的面试题感到无从下手,或者背了概念却无法在面试中灵活运用。本文旨在为准备 Java 后端岗位面试的开发者,提供一套系统、高效、可执行的复习策略和核心知识梳理。我们将围绕 Java 基础、并发编程、JVM、MySQL、Spring 等核心模块,不仅梳理高频考点,更会深入其背后的设计原理、常见应用场景和典型问题排查思路,帮助你构建起知识网络,实现从“

weixin_34043301的博客 347

Java后端面试7天冲刺:HashMap、JVM、并发、MySQL、Redis、Spring核心考点精讲

临近面试,面对海量的 Java 后端知识点,你是否感到无从下手?HashMap、JVM、并发编程、MySQL、Redis、Spring……每个都是面试必考,但每个都深不见底。本文旨在为你提供一个高效、系统的“面试急救”复习路线,聚焦核心考点与高频面试题,每天投入约2小时,用7天时间串联起后端面试的核心知识体系。无论你是准备校招还是社招,都能从中找到复习重点和答题思路。 1. 复习总览与计划制定 在开始具体知识点复习前,制定一个清晰的计划至关重要。盲目地翻阅资料或刷题往往事倍功半。本计划将核心知识点拆解到7天

weixin_33849215的博客 612

Java面试进阶:从底层原理到高并发系统设计实战

在软件开发领域,理解核心原理是构建高性能、高可用系统的基石。从计算机科学基础出发,多线程并发编程通过锁机制、CAS操作和线程池管理等技术,解决了资源共享与数据一致性问题,其价值在于提升系统吞吐量和响应速度,广泛应用于电商秒杀、实时通信等高并发场景。JVM作为Java程序的运行环境,其内存管理、垃圾回收机制直接决定了应用性能与稳定性,是服务端调优的关键。数据库索引与事务隔离级别则是保障数据操作效率与一致性的核心技术。本文聚焦Java技术栈,深入探讨并发编程中的线程安全、JVM性能调优及MySQL锁机制,并结合

weixin_30535843的博客 368

C++高性能聊天室:Reactor模型与多线程并发实战

网络编程是现代分布式系统的基石,其核心在于实现高效、可靠的进程间通信。从基础Socket编程到I/O多路复用,技术演进始终围绕提升并发处理能力与降低资源消耗展开。Reactor模型通过事件驱动机制,结合epoll等系统调用,实现了单线程管理海量连接,有效解决了C10K问题。结合线程池进行业务处理,进一步提升了吞吐量,这种架构在高性能服务器中具有重要工程价值。本文以多人聊天室为具体应用场景,深入探讨了如何基于C++实现Reactor与线程池的协同,并详细解析了其中涉及的线程安全、TCP粘包处理等关键技术难点,

banshen0201的博客 436

hot100【acm版】【2026.7.24打卡-java版本】

corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue(阻塞队列)、threadFactory、handler(拒绝策略)。以后每天就按,秋招项目【java +agent】,科研,必做项目,算法,八股,锻炼身体来总结。:Serial、ParNew、Parallel Scavenge、CMS、G1(区域化,可预测停顿)、ZGC(低延迟)。支持多线程协助扩容。:堆(对象实例、数组)、方法区(元空间,类信息、常量、静态变量,JDK8 后移出永久代)。

m0_56136663的博客 201

游戏后端Java笔试复盘:非游戏基础题考点全解析

Java基础是技术面试的基石,尤其在游戏后端开发岗位中,集合框架、并发编程和JVM内存模型等核心知识直接决定候选人能否胜任高并发、低延迟的服务器开发。游戏公司的Java岗并非只写客户端逻辑,大量登录服、战斗服、排行榜等系统都依赖扎实的Java功底。HashMap的扩容机制、synchronized与ReentrantLock的区别、可达性分析与GC Roots,这些看似常规的Java面试题,在游戏后端笔试中往往是筛选人才的关键。从基础语法到集合线程安全,从JVM调优到网络IO模型,系统梳理这些高频考点,能帮

weixin_34178244的博客 372

JAVA面试题(1~95)《上》

1、面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几个方面:  - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。  - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性...

ywl470812087的博客 4963
上一篇: 对读写锁的深入理解-读写锁技术的妙用---实现缓存
下一篇: 线程工具类-通过信号量、计时器等机制控制多线程之间的运行阻塞-笔记整理11
马克吐温
博客等级 码龄10年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值