自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(145)
  • 收藏
  • 关注

原创 【MySQL】--数据库锁机制

锁概述理论锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争抢以外,数据也是一种供需多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的问题,锁冲突也是影响数据库并发访问的一个重要因素。从这个角度来说,锁对数据库而言尤其重要,也更加复杂。锁的分类从对数据的操作类型分:读锁(共享锁)针对同一份数据,多个读操作可以同时进行而不会互相影响写锁(排它锁)当前操作没有完成前,它会阻断其他写锁和读锁从对数据操作的粒

2020-07-23 23:44:28 5453

原创 【MySQL】--索引性能分析及优化

索引是什么索引(index)是帮助MySQL高效获取数据的数据结构。索引的本质是:数据结构索引的目的在于提高查询效率,可以类比字典:查找“mysql”这个单词,需要首先定位到m字母,然后继续定位到下个字母y,以及后续的sql。如果没有索引,那么就需要 a - - z 顺序查找,效率很低。如何提高查询效率?可以简单理解为:排好序的快速查找的数据结构排序:对应order by查找:对应where例如下面的SQL语句:SELECT * FROM my_table WHER

2020-07-22 19:23:18 5974

原创 【MySQL】--SQL语句执行顺序

在实际生产环境中,尤其大数据时代,数据量剧增,对SQL的质量要求越来越严格,了解MySQl的架构提升SQL质量能极大减少生产环境SQL语句执行顺序一个完整的SQL语句框架如下:SELECT DISTINCT <select_list>FROM <left_table> <join_type> JOIN <right_table> ON <join_condition>WHERE <where_condition

2020-07-22 19:22:50 5376

原创 【MySQL】--基础

数据库的好处1.持久化数据到本地2.可以实现结构化查询,方便管理数据库相关概念1、DB:数据库,保存一组有组织的数据的容器2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据3、SQL:结构化查询语言,用于和DBMS通信的语言数据库存储数据的特点1、将数据放到表中,表再放到库中2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。4、表由列组成,我

2020-07-22 19:22:21 5310

原创 【MySQL】--架构简介

MySQL介绍MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品,世界上最流行的关系型数据库管理系统之一,在 网络应用方面,MySQL是最好的关系数据库管理系统 (Relational Database Management System,RDBMS) 应用软件之一。MySQL被设计为一个可移植的数据库,几乎能在当前所有的操作系统上运行,比如Linux,Solaris,Mac和Windows。尽管各种系统在底层(如线程)实现方面各有不同,但MySQL几

2020-07-19 00:36:16 5469

原创 【JVM】--常见的垃圾收集器

在【JVM】–对象是如何被定义为垃圾及回收算法一文中介绍了四种垃圾回收算法,分别为:引用计数法标记-清除法标记-复制法标记-整理法垃圾收集器就是上面算法理论的具体实现。目前为止还没有出现完美的收集器,更没有万能的收集器,只是针对具体应用最合适的收集器,进行分代收集。垃圾收集器JVM是一个进程,垃圾收集器就是一个线程,垃圾收集线程是一个守护线程,优先级低,其在当前系统空闲或堆中老年代占用率较大时触发。JDK7/8后,HotSpot虚拟机所有收集器及组合(连线),如下图:串行、并行 和

2020-07-12 00:07:44 5838

原创 【JVM】--几种常见的OOM分析及总结

内存溢出Out Of Memory简称OOM,在异常体系中属于错误。现总结常见的几种错误如下:OOM-Java heap space为了更快达到效果可以配置虚拟机:-Xmx10m -Xms10mpublic class OOM1 { public static void main(String[] args) { String str = "fjw"; while (true){ str += str ; }

2020-07-10 18:31:58 6212

原创 【JVM】--常见配置参数

JVM中的参数类型分三种:标配参数所有的JVM实现都必须实现这些参数的功能,而且向后兼容,比如:versionhelpshowversion相当于上面两个的和-verbose:class输出JVM载入类的相关信息,当JVM报告说找不到类或者类冲突时可此进行诊断verbose:gc输出每次GC的相关情况verbose:jni输出native方法调用的相关情况,一般用于诊断jni调用错误信息X参数默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后

2020-07-10 18:31:10 5522

原创 【JVM】--对象是如何被定义为垃圾及回收算法

GCGarbage垃圾,即内存中已经不再被使用的空间就是垃圾Garbage Collector垃圾收集器要进行垃圾收集,如何判断一个对象是否可以被回收?引用计数法Java中引用和对象是有关联的,如果要操作对象则必须用引用进行。显然一个简单的办法就是通过引用计数来判断一个对象是否可以回收。简单来说就是给对象添加一个引用计数器,每当有一个地方引用它,计数器值加一;每当有一个引用失效时,计数器值减一。任何时刻计数器值为零的对象就是不能被使用的,则这个对象就是可回收对象。publi

2020-07-09 22:29:48 5677

原创 【Java】--死锁问题定位与分析

死锁概念死锁:是指多个进程在运行过程中因争夺资源而造成的一种互相等待的现象,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。死锁产生的4个必要条件产生死锁的必要条件:互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。举个例子,如果有一

2020-07-07 19:37:26 5576

原创 【Java】--线程池原理

简介从【Java】基础10一文中我们知道:线程池: 其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。线程池的工作就是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。特点线程复用;控制最大并发数;管理线程降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁造成的消耗提高响应速度。当任务到达时,任

2020-07-06 21:23:40 5496

原创 【Java】--创建线程方法之Callable

在Java基础部分我们知道,创建线程的两种方式:继承Thread类实现Runable接口简单对比:与Runable相比继承Thread使用简单;但由于Java是单继承,不能再继承其他类,扩展性较差从JDK1.5开始java.util.concurrent包下,新增了Callable接口,可以通过实现Callable接口创建线程。与Runable接口对比实现Runable接口需重写run方法,而实现Callable是重写Call方法run方法无返回值、不能抛异常call方法有返回值

2020-07-06 21:22:44 5469

原创 【Java】--阻塞队列

阻塞队列简介在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会被自动唤醒。阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:当阻塞队列是空时,从队列中获取元素的操作将会被阻塞当阻塞队列是满时,往队列里添加元素的操作将会被阻塞试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素试图往满的阻塞队列中添加新元素的线程同样也会别阻塞,直到其他线程从队列中移除一个或多个元素或完全清空队列后是队列重

2020-07-06 21:22:06 5457

原创 【Java】--Synchronized和Lock的区别

目前在Java中存在两种锁机制:Synchronized和Lock,Lock接口及其实现类是JDK1.5增加的内容。本文将从不同角度分析两者的区别。区别1. 原始构成Synchronized 是关键字属于JVM层面monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖monitor对象,只有在同步块或方法中才能掉wait/notify等方法)monitorexitLock 是具体的类,是API层面的锁2. 使用方法Synchronized

2020-07-06 21:21:21 5416

原创 【Java】--Semaphore的介绍及应用

Semaphore简介Semaphore是java.util.concurrent包下的同步工具,它通过维护若干个许可证来控制线程对共享资源的访问。Semaphore翻译成字面意思为 信号量, Semaphore所维护的许可证数量就是允许访问共享资源的最大线程数量,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。方法说明构造器// 参数permits表示许可数目,即同时可以允许多少线程进行访问public Semaphore(int permits

2020-07-01 19:40:02 5417

原创 【Java】--CyclicBarrier的介绍及应用

CyclicBarrier简介CyclicBarrier是java.util.concurrent包下的一个类,CyclicBarrier的字面意思是 可循环(Cyclic) 使用的 屏障(Barrier) 。CyclicBarrier能让一组线程到达一个屏障(也可叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。CyclicBarrier会等齐其他线程在继续进行,即CyclicBarrie

2020-07-01 19:39:28 5500

原创 【Java】--CountDownLatch的介绍及应用

CountDownLatch简介CountDownLatch是java.util.concurrent包中的一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。它主要用来协调多个线程之间的同步,起到一个同步器的作用。总的来说,CountDownLatch让一个或多个线程在运行过程中的某个时间点能停下来等待其他的一些线程完成某些任务后再继续运行。使用场景在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。 这

2020-07-01 00:51:36 5643

原创 【Java】--锁概念总结

Java中锁的概念很多,各种各样的锁名称纷繁复杂,现总结下:公平锁/非公平锁公平锁:指多个线程按照申请锁的顺序来获取锁。类似排队打饭,先来后到非公平锁:指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。饥饿现象指某个线程一直被后来线程抢占的现象对于ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。Lock lock = new ReentrantLock();Reentrant

2020-06-30 23:14:18 5355

原创 【Java】--集合类的不安全问题总结

在高并发下,常用的Java集合就会出现许多问题,现总结如下:ArrayList在ArrayList的基础知识一文中我们知道:ArrayList是非线程安全的! 一般在单线程中才使用ArrayList。为什么ArrayList是非线程安全的?ArrayList中的方法都不加锁,比如add()// 将指定的元素插入ArrayList中的指定位置 public void add(int index, E element) { rangeCheckForAdd(index);

2020-06-30 00:03:24 5602

原创 【Java】--CAS中的ABA问题

ABA是什么一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。...

2020-06-30 00:03:01 5371

原创 【Java】--CAS知道吗?

CAS是什么compare and swap,即比较并交换对于 Java 并发中的安全问题我们最常用的方式就是使用 synchronized 关键字了,但在上文中我们知道,volatile是轻量级的synchronized(不保证原子性),同样可以用volatile,为了保证原子性可以使用JUC包下的原子操作类。这些类就用到了CAS实现原子操作。以AtomicInteger 为例:public class CASDemo { public static void main(String[]

2020-06-28 21:22:19 5396

原创 【Java】--谈谈你对volatile的理解

1、volatile是JVM提供的轻量级的同步机制volatile的特性保证可见性禁止指令重排序在【JMM】–Java内存模型 一文中,可知为了保证内存可见性,Java 编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。被volatile关键字修饰的变量,在每个写操作之后,都会加入一条store内存屏障命令,此命令强制工作内存将此变量的最新值保存至主内存;在每个读操作之前,都会加入一条load内存屏障命令,此命令强制工作内存从主内存中加载此变量的最新值至工作内存。

2020-06-19 23:24:40 5361

原创 【设计模式】--职责链模式

OA系统学校OA系统的采购审批项目:需求是采购员采购教学器材如果金额 小于等于5000, 由教学主任审批 (0<=x<=5000)如果金额 小于等于10000, 由院长审批 (5000<x<=10000)如果金额 小于等于30000, 由副校长审批 (10000<x<=30000)如果金额 超过30000以上,有校长审批 ( 30000<x)请设计程序完成采购审批项目传统方案接收到一个采购请求后,根据采购金额来调用对应的Approver (审批

2020-06-17 22:58:12 5363

原创 【设计模式】--策略模式

鸭子问题编写鸭子项目,具体要求如下:有各种鸭子(比如 野鸭、北京鸭、水鸭等, 鸭子有各种行为,比如 叫、飞行等)显示鸭子的信息传统方案public abstract class Duck { public Duck() { } public abstract void display();//显示鸭子信息 public void quack() { System.out.println("鸭子嘎嘎叫~~"); } pu

2020-06-17 22:57:46 5353

原创 【设计模式】--状态模式

APP抽奖请编写程序完成APP抽奖活动 具体要求如下:假如每参加一次这个活动要扣除用户50积分,中奖概率是10%奖品数量固定,抽完就不能抽奖活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完活动的四个状态转换关系图状态模式基本介绍状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类模式原理Conte

2020-06-17 22:57:09 5306

原创 【设计模式】--解释器模式

四则运算通过解释器模式来实现四则运算,如计算a+b-c的值,具体要求先输入表达式的形式,比如 a+b+c-d+e, 要求表达式的字母不能重复在分别输入a ,b, c, d, e 的值最后求出结果:如图传统方法编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果问题分析如果加入新的运算符,比如 * / ( 等等,不利于扩展,另外让一个方法来解析会造成程序结构混乱,不够清晰**解决方案:**可以考虑使用解释器模式, 即: 表达式 -> 解释器(可以有多种) -&

2020-06-17 22:56:17 5392

原创 【设计模式】--备忘录模式

游戏角色游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态传统方案一个对象,就对应一个保存对象状态的对象问题分析一个对象,就对应一个保存对象状态的对象, 这样当我们游戏的对象很多时,不利于管理,开销也很大传统的方式是简单地做备份,new出另外一个对象出来,再把需要备份的数据放到这个新对象,但这就暴露了对象内部的细节解决方案: => 备忘录模式备忘录模式基本介绍备忘录模式(Memento

2020-06-17 22:55:15 5308

原创 【设计模式】--中介者模式

智能家居智能家居项目:智能家居包括各种设备,闹钟、咖啡机、电视机、窗帘 等主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放...

2020-06-17 22:54:34 5316

原创 【设计模式】--观察者模式

天气预报天气预报项目需求,具体要求如下:气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。需要设计开放型API,便于其他第三方也能接入气象站获取数据。提供温度、气压和湿度的接口测量数据更新时,要能实时的通知给第三方普通方案通过对气象站项目的分析,我们可以初步设计出一个WeatherData类通过getXxx方法,可以让第三方接入,并得到相关信息当数据有更新时,气象站通过调用dataChange() 去更新数据,当第三方再次获取时,就能

2020-06-16 21:55:08 5457

原创 【设计模式】--迭代器模式

学校院系编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。如图:传统方案问题分析将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的遍历的操作(如学院的数据结构是数组,院系的数据结构是集合,则遍历方式就不同)解决方案:=> 迭代器模式迭代器模式基本介绍迭代器模式(It

2020-06-16 21:54:38 5320

原创 【设计模式】--访问者模式

测评系统将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价 有不同的种类,比如 成功、失败 等)传统方案在类man和women中分别编写代码逻辑并继承父类person问题分析如果系统比较小,还是ok的,但是考虑系统增加越来越多新的功能时,对代码改动较大,违反了ocp原则, 不利于维护扩展性不好,比如 增加了 新的人员类型,或者管理方法,都不好做可以使用新的设计模式 – 访问者模式访问者模式基本介绍访问者模式(Visitor Pattern)

2020-06-16 21:54:16 5304

原创 【设计模式】--命令模式

智能家居我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App,分别控制,我们希望只要一个app就可以控制全部智能家电要实现一个app控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给app调用,这时 就可以考虑使用命令模式命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来,动作的请求者是手机app,动作的执行者是每个厂商的一个家电产品命令模式基本介绍

2020-06-16 21:53:36 5296

原创 【设计模式】--模板模式

豆浆制作编写制作豆浆的程序,说明如下:制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎通过添加不同的配料,可以制作出不同口味的豆浆选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的请使用 模板方法模式 完成模板模式基本介绍模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行模

2020-06-16 00:45:01 5293

原创 【设计模式】--代理模式

代理模式基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK代理、接口代理)和 Cglib代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴)...

2020-06-16 00:44:37 5248

原创 【设计模式】--享元模式

展示网站小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同:有客户要求以新闻的形式发布有客户人要求以博客的形式发布有客户希望以微信公众号的形式发布传统方案直接复制粘贴一份,给每个网站租用一个空间,然后根据客户不同要求,进行定制修改问题分析需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,造成服务器的资源浪费解决思路: 整合到一个网站中,共享其相关的代码和

2020-06-14 23:53:39 5266

原创 【设计模式】--外观模式

影院管理组建一个家庭影院:DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为:直接用遥控器:统筹各设备开关开爆米花机放下屏幕开投影仪开音响开DVD,选dvd去拿爆米花调暗灯光播放观影结束后,关闭各种设备传统方式public class DVDPlayer { //使用单例模式, 使用饿汉式 private static DVDPlayer instance = new DVDPlayer(); public

2020-06-14 23:53:17 5276

原创 【设计模式】--组合模式

学校院系展示编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。如图:传统方案系继承学院,学院继承学校问题分析将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的管理的操作,比如对学院、系的添加,删除,遍历等解决方案: 把学校、院、系都看做是组织结构,他们之间没有继承的关系,

2020-06-14 23:52:54 5272

原创 【设计模式】--装饰者模式

咖啡订单咖啡订单项目(咖啡馆):咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)调料:Milk、Soy(豆浆)、Chocolate要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便使用OO的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。方案一将所有可能的组合都继承基类Drink问题分析Drink 是一个抽象类,表示饮料des就是对咖啡的描述, 比如咖啡的名字

2020-06-14 00:32:50 5452

原创 【设计模式】--桥接模式

手机案例现在对不同手机类型的不同品牌实现操作编程(比如: 开机、关机、上网,打电话等)传统方式不同样式的手机继承Phone类,不同品牌的手机分别继承不同的样式;问题分析扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本解决方案-使用桥接模式桥接模式基本介绍桥接模式(Bridge模式)是指:将实现与抽象

2020-06-14 00:32:22 5266

原创 【设计模式】--适配器模式

适配器模式插座问题不同国家的插座标准也不同,可以使用一个转换插头就可以轻松解决,该转换头即为适配器。基本介绍适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式主要分为三类:类适配器模式、对象适配器模式、接口适配器模式工作原理将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容从用户的角度看不到被适配者,是解耦的用

2020-06-13 16:20:35 5302

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除