首页 >> 中医药浴

多线程系统性(单例模式、阻塞式队列、定时器及线程池)

发布时间:2025年09月15日 12:18

l;

private Singleton1(){};

public static Singleton1 getInstance(){

synchronized (Singleton1.class){

if(instance== null){

instance= new Singleton1();

}

}

return instance;

}

}

懒汉形基本型在-多缓存特别版(改良)

局限性虽然加锁住以后,缓存确保安全疑虑得到消除了,但是又有了最初疑虑 :对于刚才这个懒汉形基本型在的标识符来说。缓存不确保安全是时有发生在instance被调用以后的.从未调用的时候,多缓存命令行getinstance,就也许同时就其到读过和修订.但是一敏instance被调用以后(一定不是nul, if必需一定不成立了),getInstance操作者就只全都两个读过操作者也就缓存确保安全了。

而按照上述的加锁住形基本型,无论标识符是调用以后,还是调用以后,每次命令行 getinstance分析方法都才会顺利进到行加锁住.也就意味着即使是调用以后(不太也许缓存确保安全了),无论如何发挥作用大量的锁住挑战。

此表标识符在加锁住的坚实上, 做单单了进到一步改动:

1.可用双重 if 确定, 降高于锁住挑战的频率。

改良可行性: 让getInstance调用以后,才顺利进到行加锁住,调用以后,就仍然加锁住了。在加锁住这那时候再连带一层必需确定才可.必需就是局限性究竟不太也许调用紧接成 (instance == null)。

在可用了双重if确定以后,局限性这个标识符进到去还发挥作用一个极为重要的疑虑:如果多个缓存,都去命令行这那时候的getlnstance 分析方法,就才会造成大量的读过instance内存的操作者,这样才才会让SQL把这个读过内存操作者优转化成读过内存操作者。

—敏这那时候触发了优转化,全面性如果第一个缓存不太也许紧接成了针对instance的修订,那么紧接着右方的缓存都感知差不多这个修订,无论如何把 instance当成null 。所以这那时候需给 instance 连带了 volatile。

2.给 instance 连带了 volatile

class Singleton2{

//不是随即调用模板

//volatile 必需内存可见性

private static volatile Singleton2 instance = null;

private Singleton2(){};

//只有在无论如何可用这个模板的时候,才才会无论如何的去创建人这个模板

public static Singleton2 getInstance(){

//可用这那时候的类实例作为锁住实例,类实例在一个代理服务器端进到去只有一份,

//确定的是究竟要加锁住。降高于了锁住挑战

if(instance == null){

//加锁住操作者,必需了缓存确保安全

synchronized (Singleton2.class){

//确定的是究竟要创建人模板

if(instance == null){

instance = new Singleton2();

}

}

}

return instance;

}

}

public class Test07 {

public static void main(String[] args) {

Singleton2 instance = Singleton2.getInstance();

}

}

二、堵塞基本型路由表

堵塞路由表是什么?

堵塞路由表是一种特殊的路由表. 也遵行 “先行进到先行单单” 的原则.

堵塞路由表是一种缓存确保安全的统计嵌套, 并且较爆冷此表特性 : 产生堵塞效果

当路由表讫的时候, 在此之后再入路由表就才会堵塞, 直到有其他缓存从路由表进到去所取偷偷地成分.当路由表飞的时候, 在此之后单单路由表也才会堵塞, 直到有其他缓存往路由表进到去插再入成分.

堵塞路由表的一个迥然各有不同应用一幕就是 “产品销售大众静稳定状态”. 这是一种相当迥然各有不同的共同开发静稳定状态。

2.1 产品销售大众静稳定状态

产品销售大众形基本型在就是通过一个容器来消除产品销售和大众的爆冷自由电子合疑虑。

产品销售和大众彼此之间不从外部通讯,而通过堵塞路由表来顺利进到行通讯,所以产品销售原材料紧接统计数据以后不须在此之后此前进到大众解决问题,从外部扔给堵塞路由表,大众不找产品销售要统计数据,而是从外部从堵塞路由表那时候所取.

1.堵塞路由表也能使产品销售和大众之间解自由电子

产品销售大众静稳定状态,是单单共同开发进到去相当有用的一种多缓存共同开发意图。相比较是在代理服务器共同开发的一幕进到去:

假设有两个代理服务器AB,A作为对面代理服务器从外部发送到代理服务器的网络劝告,B作为应用代理服务器,来给A透过一些统计数据。

如果不可用产品销售大众静稳定状态。此时A和B的自由电子合性是比起爆冷的:在共同开发A标识符的时候就得确实获知B透过的一些硬件;共同开发B标识符的时候也得确实获知A是怎么命令行的;—敏想把B替换C,A的标识符就需较大的改动,而且如果B绑了,也也许从外部随之而来A也顺背著绑了。

可用产品销售大众静稳定状态,就可以降高于这那时候的自由电子合.

对于劝告:A是产品销售,B是大众.对于响应:A是大众,B是产品销售.堵塞路由表都是作为交易场所 ,堵塞路由表就大概一个缓冲区,平衡了产品销售和大众的解决问题灵活性。

A只需关心如何和路由表交互,不需了解B;

B也只需关心如何和路由表交互,也不需了解A;

路由表是从未变的,如果B绑了,对于A没人啥因素;如果把B替换C,A也紧接全感知差不多。

2.能够对于劝告顺利进到行“削峰填谷”

从未可用产品销售大众静稳定状态的时候,如果劝告量突然暴涨(不可控)

A暴涨随之而来B暴涨;

A作为对面代理服务器,推算量很整体而言,劝告暴涨,疑虑不大.B作为应用代理服务器,推算量也许很大,需的系统对人力也越来越多.如果劝告越来越多了,需的人力进到—步增加,如果主机的操作系统对不够,也许代理服务器端就绑了。

A劝告暴涨=>堵塞路由表的劝告暴涨,由于堵塞路由表没人啥推算量,就只是所谓的存个统计数据,就能抗住越来越大的压力.

B这边无论如何按照这样一来的速率来奢侈品统计数据,不想因为A的暴涨而造成了暴涨.B就被管控的很差,就不想因为这种劝告的波动而造成了覆灭 。

"削峰”这种瞬时很多时候不是持续的,就一阵即使如此了(比如双十一一整活动)就又恢复了 。

"填谷"B无论如何是按照原本的频率来解决问题以后积压的统计数据。

单单共同开发进到去可用到的"堵塞路由表"并不是一个简单的统计嵌套了,而是一个/一组专为的代理服务器代理服务器端。并且它透过的功能也无疑是堵塞路由表的功能,还才会在这坚实之上透过越来越多的功能(对于统计数据持久转化存储,赞成多个统计数据通道,赞成多节点容灾冗余离线,赞成行政面板,便利配置数据类型…),这样的路由表又起了个最初姓氏,"假消息路由表”(从将来共同开发进到去相比较可用到的元件)。

2.2 常规库进到去的堵塞路由表

在 Java 常规库进到去内置了堵塞路由表. 如果我们需在一些代理服务器端进到去可用堵塞路由表, 从外部可用常规库进到去的才可.

BlockingQueue 是一个硬件. 无论如何做到的类是 LinkedBlockingQueue.put 分析方法主要用途堵塞基本型的再入路由表, take 主要用途堵塞基本型的单单路由表.BlockingQueue 也有 offer, poll, peek 等分析方法, 但是这些分析方法不背著有堵塞特性.

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.LinkedBlockingQueue;

public class Demo21 {

public static void main(String[] args) throws InterruptedException {

BlockingDeque queue = new LinkedBlockingDeque<>();

//再入路由表

queue.put("hello");

//单单路由表

String s = queue.take();

System.out.println(s);//hello

}

}

2.3 堵塞路由表做到通过 “尿素路由表” 的形基本型来做到.可用 synchronized 顺利进到行加锁住管控.put 插再入成分的时候, 确定如果路由表讫了, 就顺利进到行 wait. (警惕, 要在尿素进到去顺利进到行 wait. 被唤起时都是路由表就不讫了, 因为同时也许是唤起了多个缓存).take 所取单单成分的时候, 确定如果一队选为飞, 就顺利进到行 wait. (也是尿素 wait)

先行做到一个一般来说的路由表,再连带缓存确保安全,再连带堵塞(可用wait和notify有助于).

对于put来说,堵塞必需,就是一队选为讫。put 进到去的wait要由take来唤起.只要take失败了一个成分,不就路由表不讫了,就可以顺利进到行唤起了.

对于take来说,堵塞必需,就是一队选为飞。对于take 进到去的在此之后此前进到,必需是一队选为飞.路由表不为飞,也就是put失败以后,就来唤起.

import java.util.concurrent.BlockingDeque;

import java.util.concurrent.LinkedBlockingDeque;

class MyBlocking{

//基于数组做到堵塞路由表

private int[] data = new int[1000];

//路由表阔度

private int size = 0;

//一队首斜线

private int head = 0;

//一队尾斜线

private int tail = 0;

private static Object locker = new Object();

public void put(int value) throws InterruptedException {

synchronized (locker){

if(size == data.length){

//开始时站做到返起程return

// return;

//针对哪个实例加锁住,就返起程哪个实例的wait 如果是针对this加锁住,就this.wait

locker.wait();

}

//把最初成分分析方法tail所在位置上

data[tail] = value;

tail++;

//解决问题tail开到成分末尾的情形,需从头开始,重新尿素

//第1种用法

if(tail>= data.length){

tail = 0;

}

//第2种用法

// tail = tail % data.length;

size++;

//如果再入路由表失败,则路由表非飞,就唤起take进到去的堵塞在此之后此前进到

locker.notify();

}

}

//单单路由表

//可用包装类

public Integer take() throws InterruptedException {

synchronized (locker){

if(size == 0){

// return null;

locker.wait();

}

int ret = data[head];

head++;

if(head>= data.length){

head = 0;

}

size--;

// take失败以后,就唤起put进到去的在此之后此前进到.

locker.notify();

return ret;

}

}

}

public class Test08 {

public static void main(String[] args) {

MyBlocking queue = new MyBlocking();

//做到一个产品销售大众形基本型在

Thread t = new Thread(()->{

int num = 0;

while (true){

System.out.println("原材料了:" + num);

try {

queue.put(num);

// 当产品销售原材料的慢一些的时候, 大众就得偷偷地产品销售的势头偷偷地.原材料一个奢侈品一个

// Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

num++;

}

});

t.start();

Thread t2 = new Thread(()->{

int num = 0;

while (true){

System.out.println("奢侈品了:" + num);

try {

num = queue.take();

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

t2.start();

}

}

上述标识符输单单结果:

当产品销售原材料的慢一些的时候, 大众就得偷偷地产品销售的势头偷偷地,原材料一个奢侈品一个:

三、操作者

操作者也是软件共同开发进到去的一个极为重要元件。十分相似一个 “沙发”: 达到一个基本上的星期以后, 就可执行某个而无须好的标识符。

3.1 常规库进到去的操作者常规库进到去透过了一个 Timer 类. Timer 单单上是有专为的缓存,来负责可执行申请人人的战斗任务的,Timer 类的内部分析方法为 schedule .schedule 都有两个数据类型:第一个数据类型而无须就此要可执行的战斗任务标识符, 第二个数据类型而无须多长星期以后可执行 (一个单位为毫秒)。

import java.util.Timer;

import java.util.TimerTask;

public class Test09 {

public static void main(String[] args) {

Timer timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

System.out.println("hello");

}

},3000);

System.out.println("main");

}

}

先行可执行main,三秒以后可执行hello。

输单单结果:

3.2 做到操作者

Timer单单上需什么?

1.描绘出战斗任务

创建人一个专为的类来问到一个操作者进到去的战斗任务.(TimerTask)

2.民间组织战斗任务(可用一定的统计嵌套把一些战斗任务给敲到一起)

通过—定的统计嵌套(一个背著优先行级的堵塞路由表)来民间组织.

为啥要背著优先行级呢?

因为堵塞路由表进到去的战斗任务都有各自的可执行时刻 (delay). 最先行可执行的战斗任务一定是 delay 最少的. 可用背著优先行级的路由表就可以高效的把这个 delay 最少的战斗任务找单单来.

3.可执行星期到了的战斗任务

需先行可执行星期最靠此前的战斗任务,就需有一个缓存,不停的去检查局限性优先行路由表的一队首成分,看看局限性最靠此前的这个战斗任务星期究竟到了。

import java.util.concurrent.PriorityBlockingQueue;

//创建人一个类,问到一个战斗任务

class MyTask implements Comparable{ //做到Comparable硬件,基本上比起的系统对

//战斗任务确切要干什么

private Runnable runnable;

//战斗任务确切啥时候干,保存战斗任务要可执行的毫秒级星期戳

private long time;

//透过一个构造分析方法

public MyTask(Runnable runnable, long delay) { //delay是一个星期有规律,不是实际上的星期戳的值

this.runnable = runnable;

this.time = System.currentTimeMillis() + delay;

}

public void run(){

花生的博客();

}

public long getTime() {

return time;

}

@Override

public int compareTo(MyTask o) {

//让星期小的在此前,星期大的在后

return (int)(this.time - o.time);

}

}

//操作者

class MyTimer{

//操作者单单上能够存敲多个战斗任务

//此处的路由表要考虑到缓存确保安全疑虑 也许在多个缓存那时候顺利进到行申请人人战斗任务.

// 同时还有一个专为的缓存来所取战斗任务可执行.此处的路由表就需警惕缓存确保安全疑虑.

private PriorityBlockingQueue queue = new PriorityBlockingQueue<>();

//可用schedule分析方法来申请人人战斗任务到路由表进到去

public void schedule(Runnable runnable,long delay){

MyTask task = new MyTask(runnable,delay);

queue.put(task);

//每次战斗任务插再入失败以后,都唤起一下扫描缓存,让缓存重新检查一下一队首的战斗任务,看究竟星期到了要可执行

synchronized (locker){

locker.notify();

}

}

private Object locker = new Object();

//创建人一个扫描缓存

public MyTimer(){

Thread t = new Thread(()->{

while (true){

try {

//先行所取单单一队首成分

MyTask task = queue.take();

long curTime = System.currentTimeMillis();

//比起一下看局限性星期到了吗

if(curTime < task.getTime()){

//星期没人到,把战斗任务塞起程到路由表进到去

queue.put(task);

//而无须一个在此之后此前进到星期

synchronized (locker){

//wait可以被进到去途唤起 sleep不能被进到去途唤起

locker.wait(task.getTime() - curTime);

}

}else {

//星期到了,可执行战斗任务

task.run();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

t.start();

}

}

public class Test10 {

public static void main(String[] args) {

MyTimer myTimer = new MyTimer();

myTimer.schedule(new Runnable() {

@Override

public void run() {

System.out.println("hello");

}

},3000);

System.out.println("main");

}

}

1.描绘出—个战斗任务: runnable + time

2.可用优先行路由表来民间组织若干个战斗任务. PriorityBlockingQueue

3.做到schedule分析方法来申请人人战斗任务到路由表进到去.

4.创建人一个扫描缓存,这个扫描缓存不停的获所取到一队首成分,并且确定星期究竟开到.

另外要警惕,让MyTask 类能够赞成比起:做到Comparable硬件,并基本上比起的系统对

警惕消除这那时候的不来等疑虑:

在扫描缓存当进到去,如果路由表进到去的战斗任务是飞着的,就还好,这个缓存就在这那时候堵塞了 (没人疑虑)就怕路由表进到去的战斗任务不飞,并且战斗任务星期还没人到,此时就是从"不来等"(等确实是等了,但是又没人闲着,既没人有重大突破的指导工作产单单,同时又没人有顺利进到行休息)

不来等这种操作者是相当浪费CPU的,可以基于wait这样的有助于消除不来等疑虑:

wait有一个特别版本,而无须在此之后此前进到星期.(不需notify,星期到了其本质唤起)

推算单单局限性星期和战斗任务的目的之间的星期差,就在此之后此前进到这么长星期才可。

locker.wait(task.getTime() - curTime);

在在此之后此前进到过先行为进到去,也许要插再入最初战斗任务。最初战斗任务是也许显现在以后所有战斗任务的最此在后的在schedule操作者进到去,就需连带一个notify操作者。

四、缓存池塘

进到先行为比起重,若果时有创建人丢弃,才会随之而来开销大 。

缓存虽然比进到先行为整体而言了,但是如果创建人丢弃的频率进到一步增加,无论如何才会注意到开销还是有的。

消除可行性:缓存池塘or协先行为

把缓存提此前创建人好,敲到池塘子那时候,右方需用缓存,从外部从池塘子那时候所取,就并不需要从系统对这边申请人了;缓存用紧接了,也不是还给系统对,而是敲起程池塘子那时候,先下次再用 ,这起程创建人丢弃过先行为,速率就越来越较慢了 。缓存池塘最大的好处就是减少每次创建人、丢弃缓存的损耗。

为什么缓存敲在池塘子那时候,就比从系统对这边申请人释敲来的越来越较慢呢?

操作者系统对包含两种状稳定状态:代理服务器稳定状态和应用软件稳定状态

咱们自己寄给的标识符,就是在最上面的应用软件这一层来运行的,这那时候的标识符都是从“代理服务器稳定状态"运行的标识符 。

有些标识符,需命令行操作者系统对的API,进到—步的形式化就才会在应用软件进到去可执行。

例如,命令行一个System.out.println,直觉上要经过write系统对命令行,进到再入到应用软件进到去,应用软件可执行一堆形式化,管控LED输单单字符串。

在应用软件进到去运行的标识符,是从"应用软件稳定状态"运行的标识符。

创建人缓存,本身就需应用软件的赞成.(创建人缓存直觉是在应用软件进到去搞个PCB,加到链表那时候)

命令行的 Thread.start其实归根结底,也是要进到再入应用软件稳定状态来运行 ;而把创建人好的缓存敲到"池塘子那时候",由于池塘子就是代理服务器稳定状态做到的,这个敲到池塘子/从池塘子所取的过先行为不需就其到应用软件稳定状态,就是纯粹的代理服务器稳定状态标识符就能紧接成.

一般指出,纯代理服务器稳定状态的操作者,灵活性要比经过应用软件稳定状态解决问题的操作者,要灵活性越来越好。

指出应用软件稳定状态灵活性高于,敲不是说一定就真是高于,而是标识符进到再入了应用软件稳定状态,就不可控了。应用软件啥时候给你把活干紧接,把结果给你(有的时候较慢,有的时候慢).

4.1 常规库进到去的缓存池塘

常规库进到去的缓存池塘是从:ThreadPoolExecutor

juc(java.util.concurrent): concurrent模特别版的含意.Java进到去很多和多缓存无关的元件都在这个concurrent包那时候.

ThreadPoolExecutor进到去的第4个构造分析方法:

ThreadPoolExecutor(

int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler)

int corePoolSize :内部缓存(正基本型员工的数量)

int maximumPoolSize:最大缓存(正基本型员工+临时工)

long keepAliveTime:允许临时工摸鱼的星期

TimeUnit unit:星期的一个单位(s, ms, us…)

BlockingQueue workQueue:战斗任务路由表.缓存池塘才会透过一个submit分析方法让代理服务器端猿把战斗任务申请人人到缓存池塘进到去,即加到这个战斗任务路由表进到去.

ThreadFactory threadFactory:缓存工厂.缓存是怎么创建人单单来的

RejectedExecutionHandler handler:拒绝策略 ,当战斗任务路由表讫了,怎么做? 1.从外部忽略最最初战斗任务 2.堵塞在此之后此前进到3.从外部丢弃最老的战斗任务…

虽然缓存池塘的数据类型这么多,但是可用的时候最极为重要的数据类型,还是第一组数据类型:缓存池塘进到去缓存的个数。

面试题:有一个代理服务器端,这个代理服务器端要模特别版的/多缓存的来紧接成一些战斗任务,如果可用缓存池塘的话,这那时候的缓存数设为多少适合于?

没人有一个确切的数字,这要通过机动性测试的形基本型,寻找适合于的值。

例如,寄给一个代理服务器代理服务器端,代理服务器那时候通过缓存池塘,多缓存的解决问题代理服务器劝告,就可以对这个代理服务器顺利进到行机动性测试,比如构造一些劝告,寄单单代理服务器,这那时候的劝告就需构造很多,比如十度发送50/100/20. .…根据单单的企业一幕,构造一个适合于的值 。

根据这那时候各有不同的缓存池塘的缓存数,来观察代理服务器端解决问题战斗任务的速率,代理服务器端转让的CPU的占用率。

当缓存数多了,主体的速率是才会变较慢,但是CPU占用率也才会高.

当缓存数少了,主体的速率是才会变慢,但是CPU占用率也才会下降.

需寻找一个让代理服务器端速率能接受,并且CPU占用也不合理这样的平衡点。

各有不同类别的代理服务器端,因为单个战斗任务,进到去CPU上推算的星期和堵塞的星期是产自不相同的.

因此这那时候而无须一个确切的数字有时候是不靠谱。

常规库进到去还透过了一个简转化特别版本的缓存池塘–Executors,直觉是针对ThreadPoolExecutor顺利进到行了封装,透过了—些当前数据类型。

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Test11 {

public static void main(String[] args) {

//创建人一个固定缓存数目的缓存池塘,数据类型而无须了缓存的个数

ExecutorService pool = Executors.newFixedThreadPool(10);

//创建人一个则会下半年的缓存池塘,才会根据战斗任务量来顺利进到行则会下半年

// Executors.newCachedThreadPool();

//创建人一个只有一个缓存的缓存池塘

// Executors.newSingleThreadExecutor();

//创建人一个背著有操作者功能的缓存池塘,十分相似Timer

// Executors.newScheduledThreadPool();

for (int i = 0; i < 100; i++) {

pool.submit(new Runnable() {

@Override

public void run() {

System.out.println("hello");

}

});

}

}

}

4.2 做到缓存池塘

缓存池塘进到去有什么?

先行能够描绘出战斗任务(从外部可用Runnable)需民间组织战斗任务(从外部可用BlockingQueue)能够描绘出指导工作缓存.还需民间组织这些缓存.需做到,往缓存池塘那时候添加战斗任务

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.BlockingDeque;

import java.util.concurrent.LinkedBlockingDeque;

class MyThreadPool{

//1.描绘出一个战斗任务,从外部可用Runnable

//2.可用一个统计嵌套来民间组织战斗任务

private BlockingDeque queue = new LinkedBlockingDeque<>();

//3.描绘出一个缓存,指导工作缓存的功能就是从战斗任务路由表进到去所取战斗任务并可执行

static class Worker extends Thread{

//局限性缓存池塘进到去有若干个Worker缓存,这些缓存单单上都转让上述的战斗任务路由表

private BlockingDeque queue = null;

public Worker( BlockingDeque queue) {

this.queue = queue;

}

@Override

public void run() {

while (true){

try {

//尿素的去获所取战斗任务路由表的战斗任务,

//如果一队选为飞就从外部堵塞,如果路由表非飞,就获所取到进到去的段落

Runnable runnable = queue.take();

//获所取到以后,就可执行战斗任务

花生的博客();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

//4.创建人一个统计嵌套来民间组织若干个缓存

private List workers = new ArrayList<>();

public MyThreadPool(int n){

//构造分析方法进到去创建人单单若干个缓存,敲到上述的数组进到去

for (int i = 0; i < n; i++) {

Worker worker = new Worker(queue);

worker.start();

workers.add(worker);

}

}

//5.创建人一个分析方法,允许代理服务器端员敲战斗任务到缓存池塘当进到去

public void submit(Runnable runnable){

try {

queue.put(runnable);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public class Test12 {

public static void main(String[] args) {

MyThreadPool myThreadPool = new MyThreadPool(10);

for (int i = 0; i < 100; i++) {

myThreadPool.submit(new Runnable() {

@Override

public void run() {

System.out.println("hello myThreadPool");

}

});

}

}

}

[老练]该网站获所取资料

宝鸡白癜风医院排名
宁波白癜风专家
西安白癜风医院哪家专业
再林阿莫西林颗粒治疗鼻窦炎好吗
湖北男科检查
孩子口臭
乳腺增生
急支糖浆有什么作用
骨盆骨折
两性

上一篇: 世体:巴萨相信能与狼队订下特劳雷-特林康互换的交易

下一篇: 《FIFA 22》年度最佳中场球员提名名单 托德里奇领衔

友情链接