精华内容
下载资源
问答
  • 对于客户端来说,linux向外TCP最大的连接数是28232, 为什么呢? 因为它只能打开28232端口,具体看下面!...这时候去看linux源码你会发现,其实里面就已经设定值了,源码首先判断sysctl_local_port_range...

    对于客户端来说,linux向外TCP最大的连接数是28232,

    为什么呢?

    因为它只能打开28232个端口,具体看下面!

    当你写程序连接端口的时候,达到28231 - 28233左右这个连接数的时候,就会报错 cannot assign requested address

    这个时候去看linux源码你会发现,其实里面就已经设定值了,源码首先判断sysctl_local_port_range这个变量,不符合条件就返回return -EADDRNOTAVAIL; 

    sysctl_local_port_range[0] = 32768;
    sysctl_local_port_range[1] = 61000;

    可以通过这个方法改写

     echo "net.ipv4.ip_local_port_range = 1024 65000" >> /etc/sysctl.conf; sysctl -p

    不过这样的话重启后就恢复原来的数据了,要想永远生效可以修改/etc/sysctl.conf文件,增加一行:

    net.ipv4.ip_local_port_range= 1024 65000
    

    然后再执行:

    sysctl -p
    

    可以通过命令行查看客户端的最多连接数

    root@qgfzzzzzz-ubuntu1804:/proc/sys/net/ipv4# cat ip_local_port_range
    32768    60999

    单机最多有6w多连接,若想模拟实现百万级别的客户端连接,至少需要十几台机器以上,当然也可以在单机上使用多个虚拟ip来模拟实现.

    对于服务端来说,最多能接受多少个TCP连接?

    理论上是无上限的,为什么?

    因为只要你服务端开一个TCP固定端口去监听客户端的连接请求,就可以允许任何的IP主机进行访问,所以说服务端最大的连接数是2^32(IP数) * 2^16(端口数) = 2^48。不过实际情况下会受到服务器配置等条件的制约,往往达不到理论值,不过可以通过增加内存等等,这样的话才可以达到更多的连接数。

     

    展开全文
  • 一个类可以实现个接口,但是只能继承一个类
    public class SpbmServiceImpl extends BasicServiceImpl implements ISpbmService,ISpbmDao
    {
    
    }

    一个类可以实现多个接口但是只能实现一个类

    展开全文
  • 两根内存组双通道性能更强,两块硬盘组RAID速度提升,那你肯定想过,给主板多开一个CPU插槽组成双CPU平台,性能岂不是会更强吗?来来来快坐下,我理解你的意思。在主板上设置两颗CPU,优势还是挺明显的,如果总的...

    如果DIY让你觉得头疼,说明你的思路是正确的。

    两根内存组双通道性能更强,两块硬盘组RAID速度提升,那你肯定想过,给主板多开一个CPU插槽组成双CPU平台,性能岂不是会更强吗?

    来来来快坐下,我理解你的意思。在主板上设置两颗CPU,优势还是挺明显的,如果总的性能一样,双U可以分散散热压力降低CPU设计成本;

    如果单U的性能一样,双U则可以增强性能,对不对?

    87ba13e2e702becdb7fc95585b89d088.png

    霸气的双路主板

    实际上双U平台十多年前就有了,不但有同芯片组的双U平台,甚至有配备两颗不同芯片组、可同时插两种接口英特尔CPU的平台,你恐怕都没有想过。

    2a834ccd2f7e40d1d4b20a11718d957a.png

    同时插两颗不同英特尔接口CPU的平台

    安装两颗CPU的主板一般称为双路主板,目前在服务器和工作站中应用广泛,需要单独的配件支持;而家用电脑只有在早期的平台中出现过双路平台,后来便销声匿迹了。

    为什么会出现这种结果呢?其实还是使用的环境和产品定位决定的。

    双路主板要做到两个CPU协调运行其实是有巨大成本的,而且双路相较于单路的提升有限,类似于双显卡交火/速力。

    a9906bde8cfab1a5e78e445f0131384c.png

    服务器中的散热空间较为有限

    服务器和工作站更加注重稳定性和多核性能,也允许有更高的成本,可以容纳双路平台提供多核心多线程的性能,另外服务器的的体积大多固定,散热空间非常有限,也就使得双路平台的主频都较低。

    28a373d7f16663752a8e2a1e21fa19fc.png

    家用电脑有更大的散热空间

    而消费者注重的是整机的性能,需要CPU和显卡配合打出高性能,所以CPU普遍核心不多但是频率更高,可以提供更强的单核心性能,而且台式机有更大的空间,允许大尺寸的散热器进行高效散热。

    30e15043eddcbe3d7e1e39e3a4af894c.png

    新的CPU都具备了多核心多线程

    看到这你可能就明白了,核心不断增多的CPU其实可以看作是“双路”的另一种实现方式,像AMD新推出的64核128线程的处理器3990X就比双路平台实现的更为简单。

    所以单路和双路平台在走上两条不同的发展之路后基本上就不会再会合了,目前的发展在性能和成本之间找到了很好的平衡。

    如果你还是念念不忘想要攒一台双路主机,我劝你还是考虑一下性能更强的新CPU吧。

    0191b9a116154bdafa9dfcc20057f93c.png

    - THE END -

    原文链接:中关村在线

    责任编辑:上方文Q

    展开全文
  • Android如何保证一个线程最多只能有一个Looper?

    万次阅读 多人点赞 2016-04-01 21:04:59
    我们知道,Android中一个线程最多只能有一个Looper,若在已有Looper的线程中调用Looper.prepare()会抛出RuntimeException(“Only one Looper may be created per thread”)。面对这样的需求,我们可能会考虑使用一个...

    1. 如何创建Looper?

    Looper的构造方法为private,所以不能直接使用其构造方法创建。

    private Looper(boolean quitAllowed) {
        mQueue = new MessageQueue(quitAllowed);
        mThread = Thread.currentThread();
    }

    要想在当前线程创建Looper,需使用Looper的prepare方法,Looper.prepare()。
    如果现在要我们来实现Looper.prepare()这个方法,我们该怎么做?我们知道,Android中一个线程最多只能有一个Looper,若在已有Looper的线程中调用Looper.prepare()会抛出RuntimeException(“Only one Looper may be created per thread”)。面对这样的需求,我们可能会考虑使用一个HashMap,其中Key为线程ID,Value为与线程关联的Looper,再加上一些同步机制,实现Looper.prepare()这个方法,代码如下:

    public class Looper {
    
        static final HashMap<Long, Looper> looperRegistry = new HashMap<Long, Looper>();
    
        private static void prepare() {
            synchronized(Looper.class) {
                long currentThreadId = Thread.currentThread().getId();
                Looper l = looperRegistry.get(currentThreadId);
                if (l != null)
                    throw new RuntimeException("Only one Looper may be created per thread");
                looperRegistry.put(currentThreadId, new Looper(true));
            }
        }
        ...
    }

    上述方法对Looper.class对象进行了加锁,这些加锁开销有可能造成性能瓶颈。
    有没有更好的方法实现Looper.prepare()方法?看一看Android的中Looper的源码。

    public class Looper {
    
        static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
    
        public static void prepare() {
           prepare(true);
        }
    
        private static void prepare(boolean quitAllowed) {
           if (sThreadLocal.get() != null) {
               throw new RuntimeException("Only one Looper may be created per thread");
           }
           sThreadLocal.set(new Looper(quitAllowed));
        }
        ...
    }

    prepare()方法中调用了ThreadLocal的get和set方法,然而整个过程没有添加同步锁,Looper是如何实现线程安全的?

    2. ThreadLocal

    ThreadLocal位于java.lang包中,以下是JDK文档中对该类的描述

    Implements a thread-local storage, that is, a variable for which each thread has its own value. All threads share the same ThreadLocal object, but each sees a different value when accessing it, and changes made by one thread do not affect the other threads. The implementation supports null values.

    大致意思是,ThreadLocal实现了线程本地存储。所有线程共享同一个ThreadLocal对象,但不同线程仅能访问与其线程相关联的值,一个线程修改ThreadLocal对象对其他线程没有影响。

    ThreadLocal为编写多线程并发程序提供了一个新的思路。如下图所示,我们可以将ThreadLocal理解为一块存储区,将这一大块存储区分割为多块小的存储区,每一个线程拥有一块属于自己的存储区,那么对自己的存储区操作就不会影响其他线程。对于ThreadLocal<Looper>,则每一小块存储区中就保存了与特定线程关联的Looper。
    这里写图片描述

    3. ThreadLocal的内部实现原理

    3.1 Thread、ThreadLocal和Values的关系

    Thread的成员变量localValues代表了线程特定变量,类型为ThreadLocal.Values。由于线程特定变量可能会有多个,并且类型不确定,所以ThreadLocal.Values有一个table成员变量,类型为Object数组。这个localValues可以理解为二维存储区中与特定线程相关的一列。
    ThreadLocal类则相当于一个代理,真正操作线程特定存储区table的是其内部类Values。
    这里写图片描述
    这里写图片描述

    3.2 set方法

    public void set(T value) {
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread);
        if (values == null) {
            values = initializeValues(currentThread);
        }
        values.put(this, value);
    }
    
    Values values(Thread current) {
        return current.localValues;
    }

    既然与特定线程相关,所以先获取当前线程,然后获取当前线程特定存储,即Thread中的localValues,若localValues为空,则创建一个,最后将value存入values中。

    void put(ThreadLocal<?> key, Object value) {
        cleanUp();
    
        // Keep track of first tombstone. That's where we want to go back
        // and add an entry if necessary.
        int firstTombstone = -1;
    
        for (int index = key.hash & mask;; index = next(index)) {
            Object k = table[index];
    
            if (k == key.reference) {
                // Replace existing entry.
                table[index + 1] = value;
                return;
            }
    
            if (k == null) {
                if (firstTombstone == -1) {
                    // Fill in null slot.
                    table[index] = key.reference;
                    table[index + 1] = value;
                    size++;
                    return;
                }
    
                // Go back and replace first tombstone.
                table[firstTombstone] = key.reference;
                table[firstTombstone + 1] = value;
                tombstones--;
                size++;
                return;
            }
    
            // Remember first tombstone.
            if (firstTombstone == -1 && k == TOMBSTONE) {
                firstTombstone = index;
            }
        }
    }

    从put方法中,ThreadLocal的reference和值都会存进table,索引分别为index和index+1。
    对于Looper这个例子,
    table[index] = sThreadLocal.reference;(指向自己的一个弱引用)
    table[index + 1] = 与当前线程关联的Looper。

    3.3 get方法

    public T get() {
        // Optimized for the fast path.
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread);
        if (values != null) {
            Object[] table = values.table;
            int index = hash & values.mask;
            if (this.reference == table[index]) {
                return (T) table[index + 1];
            }
        } else {
            values = initializeValues(currentThread);
        }
    
        return (T) values.getAfterMiss(this);
    }

    首先取出与线程相关的Values,然后在table中寻找ThreadLocal的reference对象在table中的位置,然后返回下一个位置所存储的对象,即ThreadLocal的值,在Looper这个例子中就是与当前线程关联的Looper对象。

    从set和get方法可以看出,其所操作的都是当前线程的localValues中的table数组,所以不同线程调用同一个ThreadLocal对象的set和get方法互不影响,这就是ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。

    4. ThreadLocal背后的设计思想Thread-Specific Storage模式

    Thread-Specific Storage让多个线程能够使用相同的”逻辑全局“访问点来获取线程本地的对象,避免了每次访问对象的锁定开销。

    4.1 Thread-Specific Storage模式的起源

    errno机制被广泛用于一些操作系统平台。errno 是记录系统的最后一次错误代码。对于单线程程序,在全局作用域内实现errno的效果不错,但在多线程操作系统中,多线程并发可能导致一个线程设置的errno值被其他线程错误解读。当时很多遗留库和应用程序都是基于单线程编写,为了在不修改既有接口和遗留代码的情况下,解决多线程访问errno的问题,Thread-Specific Storage模式诞生。

    4.2 Thread-Specific Storage模式的总体结构

    这里写图片描述

    线程特定对象,相当于Looper。
    线程特定对象集包含一组与特定线程相关联的线程特定对象。每个线程都有自己的线程特定对象集。相当于ThreadLocal.Values。线程特定对象集可以存储在线程内部或外部。Win32、Pthread和Java都对线程特定数据有支持,这种情况下线程特定对象集可以存储在线程内部。
    线程特定对象代理,让客户端能够像访问常规对象一样访问线程特定对象。如果没有代理,客户端必须直接访问线程特定对象集并显示地使用键。相当于ThreadLocal<Looper>。

    从概念上讲,可将Thread-Specific Storage的结构视为一个二维矩阵,每个键对应一行,每个线程对应一列。第k行、第t列的矩阵元素为指向相应线程特定对象的指针。线程特定对象代理和线程特定对象集协作,向应用程序线程提供一种访问第k行、第t列对象的安全机制。注意,这个模型只是类比。实际上Thread-Specific Storage模式的实现并不是使用二维矩阵,因为键不一定是相邻整数。
    这里写图片描述

    参考资料

    1. Thread-local storage
    2. 面向模式的软件架构·卷2:并发和联网对象模式
    展开全文
  • 多继承会产生钻石问题(菱形继承) B 和 C 继承自 A,且都重写了 A 中的同一个方法 ...接口中的方法是抽象的,一个类实现可以个接口 假设这些接口中存在相同方法(方法名与参数相同),...
  • 接口 接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
  • 4主要的map实现类介绍

    万次阅读 多人点赞 2019-07-31 18:36:57
    map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map,HashMap的值是没有顺序的,他是按照key的HashCode来...
  • 一个接口多个实现类,如何指定特定实现类进行调用示例解决方法 在写程序的时候经常会遇到 写一个接口有多个实现类,那么在调用的时候是如何去确定调用的是哪个实现类呢?接下来将为你介绍种方式: 示例 总接口 ...
  • java容器的两大接口collection和map,是Java容器中的最主要的两个接口。其他容器都是从这两个接口中派生出来的。
  • 方法参数最多不宜超过4

    千次阅读 2014-08-07 17:27:00
    方法参数最多不宜超过4 、方法的定义,方法的功能 二、方法基于可能的参数,可以实现的功能种数 三、本人认为赋予方法的功能的数目越少方法本身就越好用,用的越安全 四、假设方法赋予完成的功能是...
  • 文链接:http://justinblank.com/experiments/howmanytypeparameterscanajavamethodhave.html在JVM中,一个...
  • 5IO口最多能扫描多少按键?

    千次阅读 2012-04-09 22:35:13
    简介:在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO,好不容易挤出一两个IO,却发现仍然不够用,实在没办法了就添加一个IC来扫键。一个IC虽然...
  • JAVA实现类继承父类并实现个接口

    千次阅读 2020-06-25 16:36:45
    2.一个类的直接父类是唯一的 , 但是一个类可以同时实现个接口 3.如果实现类实现的多个接口当中 , 存在重复的抽象方法 , 那么只需要覆盖重写一次即可 4.如果实现类没有覆盖重写所有接口当中的所有抽象方法 , 那么...
  • 对于给定的n位于同二维平面上的点,求最多能有多少点位于同一直线上。 思路:依次遍历所有点,计算两点的斜率(考虑重合点和垂直点的特殊情况),非重合斜率相等的点则位于同一直线上。采用Map存储斜率,其中...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">...100id需要,...
  • java中list最多可以存储多少条数据

    千次阅读 2016-11-01 18:48:31
    从语言上来看,java.util.List是个接口,其下有N多实现,最常用的是ArrayList和LinkedList及其各种继承或同步化实现(如...理论上是无限的另外,List里放的东西都是在内存里的(当然你也可以自己实现一个放磁盘上...
  • 实现(继承)几个接口?(多个) 说实话这还是挺搞的。本人的记忆方法是—— 父类=亲爸; 接口=干爹; 一个人可能有很多个干爹,但是亲爸永远只有一个。 他可以同时继承亲爸和干爹的财产。 是不是很有道理呢~~~...
  • 一个类可以实现个接口:class D implements A,B,C{}。但是一个类只能继承一个类,不能继承多个:class B extends A{}。在继承的同时,也可以继承接口:class E extends D implements A,B,C{}。 接口的使用原则...
  • 本文主要介绍利用条IO口实现按键功能的实现
  • 其实这道题吧,如果你没有碰见过这样的业务的话,说实话确实不好说,特别是我这种菜鸟,都是在个人的小公司里面混日子的。 那会碰见这样业务需求呢,大厂这辈子 是进不去了,我就在自己博客这亩三分地 好好耕种...
  • 为了实现人脸识别,需要实现以下几个步骤: 1、创建一个Person Group。人需要通过组来进行管理组织。每个组最多有1000个人,免费的每个订阅最多1000人,S0订阅的每个组10000人,每个订阅上限1M组、100M人。 2、创建...
  • java 的接口可以实现接口吗?抽象呢?

    万次阅读 多人点赞 2017-05-15 15:52:56
    面试中可能会遇到这样的问题: 1.接口可以实现接口吗? ans:不可以. 2.抽象类可以实现接口吗? ans:可以
  • 以前想过一个类似问题,就是没有每个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。 于是这个问题也被以前的思想带坑里了,把突破完全放在了如何处理每个人的随机数上。 于是在面试时间就没有解决...
  • Linux服务器最多能开放多少端口?

    千次阅读 2020-04-22 17:20:22
    物理端口指的是物理存在的端口,如ADSL Modem、集线器、交换机、路由器上用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的...
  • Pattern中的matcher()方法,生成一个匹配 器对象,Matcher是匹配器 */ Map, Integer> tp = new TreeMap, Integer>(); while (matcher.find()) { /*用 Matcher中的find()方法,查找与模式匹配的下一...
  • 这种路由器允许用户在一个局域网 内共享多条的宽带外线,不必把内部网络按照WAN数量分成独立的几个部分。多WAN宽带路由器中的“多”,一般以2个的最多。从应用的角度来讲,3个甚至4 个的WAN,意义大吗?这么多...
  • 2、Student类实现Comparable接口,并实现compareTo方法(按照成绩属性比较大小); 3、定义测试,创建5学生对象,并使用Arrays.sort()方法对5学生对象排序。 可能的Java代码: /** * 方便输入和测试的原因,...
  • 先明确几个概念:Class文件是组以8字节为基础单位的二进制流各个数据项目严格按照顺序紧凑排列在class文件中中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序Java虚拟机规范规定,Class...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 211,289
精华内容 84,515
关键字:

一个类最多可以实现几个接口