• 关于

    A类函数是啥

    的搜索结果

回答

S::*xmeth是个啥?S是个类吧,xmeth 是类的一个成员?根据模板的参数 template可知,S、A1、A2和R都是类。所以, S::* // 表示指向类 S 的成员的指针S::*xmeth // 表示该指针的变量名是 xmeth成员能当做变量类型吗?不能,函数reg的第三个参数的类型是成员函数指针,不是成员。 具体来说,函数reg的第三个参数的变量名是meth,类型是int (S::*)(const A1, const A2, R &)。即meth是一个指向类S的成员函数的指针,这种类S的成员函数有三个参数,这三个参数的类型分别是const A1, const A2和R &,这种类S的成员函数的返回值类型是int。 用英语可能更容易理解:meth is a pointer points to member function of class S whose parameters are const A1, const A2 and R &, return type is int.

a123456678 2019-12-02 02:02:02 0 浏览量 回答数 0

回答

Teacher类本身没有默认的构造函数,因此Node里面的Tt没法默认构造。 话说你用的啥IDE?IDE是xcode已经解决,是因为Teacher没有提供默认的构造函数。这明显是xcode应该是编译器使用的C++14标准,你的Node没有声明生成默认构造函数,使用:Node()=default;来声明默认构造函数,还有你的Teacher也没有默认的构造函数。

爱吃鱼的程序员 2020-06-12 10:51:50 0 浏览量 回答数 0

回答

读了三遍,愣是没读懂楼主想说啥。######@java_zf 我现在在做的一个项目用到了多线程,我就在项目中子线程调用的一个函数中加了个sleep。你可以写个简单的代码试一下,应该比较简单。你试验的结果不一样吗?我这个项目是Linux下的。######我看下你的代码。######刚试了下,不在run中也有效。######扼,呵呵 其实就是不在run方法体中的Thread.sleep()这句话是有效的呢还是无效的呢?######不在自建线程,就在主线程,肯定是有效的吧######不加 不就无效么###### 引用来自“zcj”的答案 读了三遍,愣是没读懂楼主想说啥。 回复 @zcj : 不一样,我的就是一个类实现了Runnable接口,然后它有3个方法,一个是主函数,一个run方法,一个是test方法。首先主函数里面实例化这个类,然后实例化Thread将这个类传给Thread然后start()开启一个线程,  这个线程就会执行那个run的方法体,所以run的方法体中的Thread.sleep会执行,而用实例化类的引用调用那个test方法时,并不会执行那个Thread.sleep(),所以我才这么认为的,不知道你看明白我说的了么? ######回复 @java_zf : 那sleep就没用了######回复 @zcj : run没有调用test呢?######我是用C语言试的。你的例子中如果run调用了test的话sleep应该会有作用的。Java中创建线程start后新线程只会调用run方法,也就是说run就相当于新线程的main函数。######我也没读懂是什么意思。######不是太熟悉java的线程,但是想到一些问题: Thread 的start方法 会新启动一个 线程 ? 那么原来的main函数 是不是 也运行在另外一个线程里面, 所以现在有两个线程, 主线程 和 新启动的线程 而run方法中的调用Thread.sleep() 是会使哪个线程sleep掉呢?######子线程会sleep,主线程不会, 但是若调用子线程对象.sleep()方法, 则子线程不会sleep,而主线程会sleep。 我以为该帖子是在这个经典问题呢,但是现在看好像不是。###### 看不懂到底问的是啥。 Thread.sleep()  让当前运行的线程停下来。######很HIGH的进来,很失望的留言。。 ######使用了同一把锁的问题。

kun坤 2020-06-02 15:46:57 0 浏览量 回答数 0

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

回答

读了三遍,愣是没读懂楼主想说啥。######@java_zf 我现在在做的一个项目用到了多线程,我就在项目中子线程调用的一个函数中加了个sleep。你可以写个简单的代码试一下,应该比较简单。你试验的结果不一样吗?我这个项目是Linux下的。######我看下你的代码。######刚试了下,不在run中也有效。######扼,呵呵 其实就是不在run方法体中的Thread.sleep()这句话是有效的呢还是无效的呢?######不在自建线程,就在主线程,肯定是有效的吧###### 不加 不就无效么###### 引用来自“zcj”的答案 读了三遍,愣是没读懂楼主想说啥。 回复 @zcj : 不一样,我的就是一个类实现了Runnable接口,然后它有3个方法,一个是主函数,一个run方法,一个是test方法。首先主函数里面实例化这个类,然后实例化Thread将这个类传给Thread然后start()开启一个线程,  这个线程就会执行那个run的方法体,所以run的方法体中的Thread.sleep会执行,而用实例化类的引用调用那个test方法时,并不会执行那个Thread.sleep(),所以我才这么认为的,不知道你看明白我说的了么? ######回复 @java_zf : 那sleep就没用了######回复 @zcj : run没有调用test呢?######我是用C语言试的。你的例子中如果run调用了test的话sleep应该会有作用的。Java中创建线程start后新线程只会调用run方法,也就是说run就相当于新线程的main函数。###### 我也没读懂是什么意思。###### 不是太熟悉java的线程,但是想到一些问题: Thread 的start方法 会新启动一个 线程 ? 那么原来的main函数 是不是 也运行在另外一个线程里面, 所以现在有两个线程, 主线程 和 新启动的线程 而run方法中的调用Thread.sleep() 是会使哪个线程sleep掉呢?######子线程会sleep,主线程不会, 但是若调用子线程对象.sleep()方法, 则子线程不会sleep,而主线程会sleep。 我以为该帖子是在这个经典问题呢,但是现在看好像不是。###### 看不懂到底问的是啥。 Thread.sleep()  让当前运行的线程停下来。######很HIGH的进来,很失望的留言。。 ######使用了同一把锁的问题。

kun坤 2020-06-14 16:09:59 0 浏览量 回答数 0

问题

支付宝小程序云训练营优秀学员提问来啦

问问小秘 2020-06-15 15:57:38 159 浏览量 回答数 1

回答

"读了三遍,愣是没读懂楼主想说啥。######<a href=""http://my.oschina.net/u/182706"" target=""_blank"">@java_zf 我现在在做的一个项目用到了多线程,我就在项目中子线程调用的一个函数中加了个sleep。你可以写个简单的代码试一下,应该比较简单。你试验的结果不一样吗?我这个项目是Linux下的。######我看下你的代码。######刚试了下,不在run中也有效。######扼,呵呵 其实就是不在run方法体中的Thread.sleep()这句话是有效的呢还是无效的呢?######不在自建线程,就在主线程,肯定是有效的吧###### 不加 不就无效么<img alt="""" src=""http://www.oschina.net/js/ke/plugins/emoticons/22.gif"" />######<div class=""ref""> 引用来自“zcj”的答案 读了三遍,愣是没读懂楼主想说啥。 回复 @zcj : 不一样,我的就是一个类实现了Runnable接口,然后它有3个方法,一个是主函数,一个run方法,一个是test方法。首先主函数里面实例化这个类,然后实例化Thread将这个类传给Thread然后start()开启一个线程,  这个线程就会执行那个run的方法体,所以run的方法体中的Thread.sleep会执行,而用实例化类的引用调用那个test方法时,并不会执行那个Thread.sleep(),所以我才这么认为的,不知道你看明白我说的了么? ######回复 @java_zf : 那sleep就没用了######回复 @zcj : run没有调用test呢?######我是用C语言试的。你的例子中如果run调用了test的话sleep应该会有作用的。Java中创建线程start后新线程只会调用run方法,也就是说run就相当于新线程的main函数。###### 我也没读懂是什么意思。###### 不是太熟悉java的线程,但是想到一些问题: Thread 的start方法 会新启动一个 线程 ? 那么原来的main函数 是不是 也运行在另外一个线程里面, 所以现在有两个线程, 主线程 和 新启动的线程 而run方法中的调用Thread.sleep() 是会使哪个线程sleep掉呢?######子线程会sleep,主线程不会, 但是若调用子线程对象.sleep()方法, 则子线程不会sleep,而主线程会sleep。 我以为该帖子是在这个经典问题呢,但是现在看好像不是。###### 看不懂到底问的是啥。 Thread.sleep()  让当前运行的线程停下来。######很HIGH的进来,很失望的留言。。 ######使用了同一把锁的问题。"

montos 2020-06-03 22:28:27 0 浏览量 回答数 0

回答

面试经历: 一面内容: 1,上来面试官就说,先做道题:f(n)=f(n-1)+f(n-2)+f(n-3) ,n>=3 写一个高效算法求f(n),最后再其指引过程中做了个较好的结果,最好的没想出来 2, 叫我讲述A*算法,因为我游戏里用到了 3, 求 二叉树的最大子树和,没见过的题目,不过居然想出来了,然后面试官对此题目扩展,如果答出最难的,评级就是A+ 4,介绍项目相关,画了个图解释了下就过了 二面内容: 1, 问了一大堆tcp相关的问题,RST在tcp协议中有啥作用,线程进程问题,线程安全之类的,表示不太会 2, 设计一个类,给出了2个函数,要你实现,给你一个结构体数组,结构体如下:struct Node{int id, Data data},输入一个结构体数组,实现2个函数,vector<Node> getAll() 返回这 结构体数组中相同id项的最后一次出现的那个结构体,void add(Node node);添加一个结构体到类的private数据结构里。用hash可以解决 3,如果给o你一个网易游戏的offer和阿里的offer,你选哪个。这问题问的可以。。。。。。 4还问了道算法题,具体忘了,有点难 面内容: 三面时面试官的桌子上写着算法工程师,当时直接吓尿,算法蒟蒻表示压力山大,结果出了2道智力题。。。。。 1, 给你2k+1个连续格子,2人下棋,规则是,当一个人在某个格子下子的时候,该棋子左右2边的格子都会被占掉,也就是说不能在这里下棋了,当一个人下子后这个棋盘没有空余位 置则该人获胜,问这个游戏是否有必胜策略,当时我觉得好难,最后我从1个格子,3个格子,5个格子这样一次找规律,然后面试官提示了对称性,最后居然解决了 2,A ,B,C3人坐在一个圆桌旁,每人帽子上有个数字,每个人都可以看到其他2人的数字,不知道自己的数字,并且都知道这3个数字呈等比数列这一关系。这是第四者问A,你知道你 的数字是啥么。A说不知道,然后问B,B说不知道,然后问C,C说知道了。。。。。。。请问:这时你能推断出什么。 我在纸上列出了可能的情况,但是还是找不到突破口,最 后面试官解释了,我没听懂,太绕了,这题目需要很强的逻辑能力, 3面就这样结束了 四面内容: hr面,各种人生和价值观问题 1,你为什么选择阿里,阿里文化是什么,我说了几个,扯了下马云自传 2,你有女朋友么。当然回答没有,理由:找女朋友这事不要急,你现在要做的只是设法提升自己,不断让自己更强,等到时机成熟,就不是你去找别人了,而是别人来找你 3,你有参加过集体活动么。怎么处理人际间的矛盾,怎么为人处事之类的 4,父母是干啥的。这个也问我也是醉了。

祁同伟 2019-12-02 01:21:33 0 浏览量 回答数 0

回答

两个都没有错,Class.<function_name>=function(){}这种方式,一般拿来写一些类的静态方法。比如像Java里边的String.format()就可以用String.format=function(str){returnstr}这种方式实现。 Class.prototype.<function_name>=function(){//whatever}这种方法是扩展对象的方法,这里的function可以访问实例(instance)的this变量。 要访问这个函数必须new下。用实例来访问 classInstance.<function_name>=function(){}这种方式是动态附加一个函数在这个实例(instance)上,没有什么实际作用,个人认为。 一般classInstance.<property>这种方式会用的比较多,动态添加变量的属性。 -------------- 由于这部分比较侧重于OOP(面向对象)的js写法,所以在这个语境下我用Class来代替Fuction描述。回复 @wnow20:能解决问题,解答疑问就好,是不是最佳答案不是重点回复 @mr-zhuo:嗯嗯,是的,不过现在又多了个问题Object.prototype.fn为什么能被静态调用,而PrivateClass.prototype.fn不能静态调用PrivateClass.fn();//error回复 @mr-zhuo:能这样理解么,如下:只有Object.prototype.fn定义的原型变量的函数,任何类都可以静态调用?回复 @wnow20:应该这样理解Object是整个js所有类型的基类,包括它自己在Object.prototype下定义的所有方法和属性,都会被继承varx=1;x.fn();//一样能调用,因为x是Number类型,Number继承了Object.prototype的方法回复 @mr-zhuo:回复 @mr-zhuo:我这里测试可以的,代码具体如下:"usestrict"Object.prototype.fuck=function(){return111;}console.log(Object.fuck()); WhatisObject 你是想为object定义一个f**k属性,而object你并没有定义。js也不会为你默认去创建一个对象。 varobject={}; //这里定义一个空的对象 object.fuck=xxxx //为该对象添加一个属性你好像没有说清楚两者的区别。规则就是规则,没有为什么嗯嗯,你说的很对,可是我想知道具体是哪个语法,这样我才能查资料学习。你知道是什么语法么?上面那个在什么浏览器上会报错?没报错啊googlechrome,其它的我没试过,估计是语法 不懂就别回答,误人子弟。 前端正因为不懂却还非要插一脚的人太多,搞得别人都不信任这个职位了。 楼主也不要问这些问题,没什么高手来答的,只会引来搅屎棍。 这本书不错,http://book.douban.com/subject/10546125/,不打算一辈子不懂,就把它啃完。回复 @wnow20:权威指南跟api说明没啥不一样。如果你懂基本语法。果断高级程序设计。。经典书目。。2本都很好,一本叫宝典,一本叫经典回复 @铂金小江:嗯嗯。是的额,哦,谢谢,我刚正在看《JavaScript权威指南》,两本书哪本好呀?回复 @wnow20:都看完,自然会知道哪个好。靠自己。语法肯定是错误的,Object是js里的对象,你这样引用当然不对了回复 @mr-zhuo:是的,没错这个语法应该没错吧 Object是JavaScript里的一个function,我们一般叫它构造函数。 typeofObject==="function"//true 虽然『在JavaScript里一切都是对象』,但是对函数使用『.』操作符将不会产生任何效果。 functionA(){};A.b=1;//undefinedconsole.log(A);//functionA(){} 通过new操作符调用构造函数,就能产生一个新的对象。 functionA(){};vara=newA();//a是一个对象,A是构造函数 这时再通过『.』操作符给对象a增加属性就和普通的对象操作无异了。A.b=1;//成立的,而且也是有效的你说Object是function,那你说的不是矛盾么? 引用来自“Lightning_Strike”的评论 两个都没有错,Class.<function_name>=function(){}这种方式,一般拿来写一些类的静态方法。比如像Java里边的String.format()就可以用String.format=function(str){returnstr}这种方式实现。 Class.prototype.<function_name>=function(){//whatever}这种方法是扩展对象的方法,这里的function可以访问实例(instance)的this变量。 要访问这个函数必须new下。用实例来访问 classInstance.<function_name>=function(){}这种方式是动态附加一个函数在这个实例(instance)上,没有什么实际作用,个人认为。 一般classInstance.<property>这种方式会用的比较多,动态添加变量的属性。 -------------- 由于这部分比较侧重于OOP(面向对象)的js写法,所以在这个语境下我用Class来代替Fuction描述。functionClass(){};Class.prototype.fn=function(){/*code*/}Class.fn();//error直接输这一段代码,不输上面那一段,应该是报错的是的,Class.fn()调用的还是Object.prototype.fn这里定义的函数 Object.prototype.fn=function(){return"thisisObject'sfunction";}functionClass(){}Class.prototype.fnx=function(){return"thisisClass'sfunction";}vartest=newClass();test.fny=function(){return"thisistest'sfunction";};test.fny();//直接运行test.fny方法test.fnx();//先查找test有没有fnx属性,有直接执行,没有就找test的构造函数Class.prototype有没有这个fnx,有就执行Class.prototype.fnx();test.fn();//先查找test有没有fn属性,有直接执行,没有就找test的构造函数Class.prototype有没有fn,还是没有,继续找Object.prototype.fn,然后执行,如果Object.prototype.fn还是没有,报错/*PrivateClass.prototype.fn不能静态调用PrivateClass.fn()因为调用PrivateClass.fn的时候,先判断PrivateClass有没有fn方法,没有就找Object.prototype有没有fn方法如果是varx=newPrivateClass();x.fn就会先看PrivateClass.prototype.fn存不存在所以x.fn();就会不报错*/

爱吃鱼的程序员 2020-06-20 16:47:46 0 浏览量 回答数 0

回答

可以在new form2 的时候加参数  new Form2(id)     form2的构造函数中加个接收参数    private int _id; private Form2(int id) { this._id=id } 调用的时候: Form2 fm2=new Form2(id) fm2.show();       但是不建议这样用 你在登录窗体的时候已经获得了当前用户的登录信息为啥不用一个全局的静态登录类保存登录信息呢?######Winform 的一般做法是 使用一个资源保持登录的信息,如静态变量。 如果只有两个form的话, 你可以直接把 form1 对象 赋值给form2 的某个属性  。

kun坤 2020-06-03 09:46:22 0 浏览量 回答数 0

问题

【技术干货】前端工程师看过来!一种Ajax缩放图片上传的办法 !

驻云科技 2019-12-01 21:08:17 6525 浏览量 回答数 2

回答

. 在编写一个类时,如果该类中的代码可能运行与多线程环境下,就要考虑同步问题了。 会同时被多个线程访问的资源,就是竞争资源,也称为竞争条件。对于多线程共享的资源我们必须进行同步,以避免一个线程的改动被另一个线程所覆盖。 synchronized 关键字有两种作用域: 1> 某个对象实例内,synchronized aMethod(){}关键字可以防止多个线程访问对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法. 2> 是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。 synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法; Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。      二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。      三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。      四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部   分的访问都被暂时阻塞。      五、以上规则对其它对象锁同样适用. 2. synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。   synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:   synchronized void accessVal(int newVal);   synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能 执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行 状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有 一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized) 。  在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成 员变量的访问。  synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可 以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供 了更好的解决办法,那就是 synchronized 块。   synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:  synchronized(syncObject) {   //允许访问控制的代码  }  synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机 制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。  对synchronized(this)的一些理解 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线 程必须等待当前线程执行完这个代码块以后才能执行该代码块。  二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized (this)同步代码块。  三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this) 同步代码块的访问将被阻塞。  四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个 object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。  五、以上规则对其它对象锁同样适用 3.打个比方:一个object就像一个大房子,大门永远打开。房子里有 很多房间(也就是方法)。 这些房间有上锁的(synchronized方法), 和不上锁之分(普通方法)。房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间。 另外我把所有想调用该对象方法的线程比喻成想进入这房子某个 房间的人。所有的东西就这么多了,下面我们看看这些东西之间如何作用的。 在此我们先来明确一下我们的前提条件。该对象至少有一个synchronized方法,否则这个key还有啥意义。当然也就不会有我们的这个主题了。 一个人想进入某间上了锁的房间,他来到房子门口,看见钥匙在那儿(说明暂时还没有其他人要使用上锁的 房间)。于是他走上去拿到了钥匙 ,并且按照自己 的计划使用那些房间。注意一点,他每次使用完一次上锁的房间后会马上把钥匙还回去。即使他要连续使用两间上锁的房间, 中间他也要把钥匙还回去,再取回来。 因此,普通情况下钥匙的使用原则是:“随用随借,用完即还。” 这时其他人可以不受限制的使用那些不上锁的房间,一个人用一间可以,两个人用一间也可以,没限制。但是如果当某个人想要进入上锁的房 间,他就要跑到大门口去看看了。有钥匙当然拿了就走,没有的话,就只能等了。 要是很多人在等这把钥匙,等钥匙还回来以后,谁会优先得到钥匙?Not guaranteed。象前面例子里那个想连续使用两个上锁房间的家伙,他 中间还钥匙的时候如果还有其他人在等钥匙,那么没有任何保证这家伙能再次拿到。 (JAVA规范在很多地方都明确说明不保证,象 Thread.sleep()休息后多久会返回运行,相同优先权的线程那个首先被执行,当要访问对象的锁被 释放后处于等待池的多个线程哪个会优先得 到,等等。我想最终的决定权是在JVM,之所以不保证,就是因为JVM在做出上述决定的时候,绝不是简简单单根据 一个条件来做出判断,而是 根据很多条。而由于判断条件太多,如果说出来可能会影响JAVA的推广,也可能是因为知识产权保护的原因吧。SUN给了个不保证 就混过去了 。无可厚非。但我相信这些不确定,并非完全不确定。因为计算机这东西本身就是按指令运行的。即使看起来很随机的现象,其实都是有规律 可寻。学过 计算机的都知道,计算机里随机数的学名是伪随机数,是人运用一定的方法写出来的,看上去随机罢了。另外,或许是因为要想弄 的确定太费事,也没多大意义,所 以不确定就不确定了吧。) 再来看看同步代码块。和同步方法有小小的不同。 1.从尺寸上讲,同步代码块比同步方法小。你可以把同步代码块看成是没上锁房间里的一块用带锁的屏风隔开的空间。 2.同步代码块还可以人为的指定获得某个其它对象的key。就像是指定用哪一把钥匙才能开这个屏风的锁,你可以用本房的钥匙;你也可以指定 用另一个房子的钥匙才能开,这样的话,你要跑到另一栋房子那儿把那个钥匙拿来,并用那个房子的钥匙来打开这个房子的带锁的屏风。          记住你获得的那另一栋房子的钥匙,并不影响其他人进入那栋房子没有锁的房间。          为什么要使用同步代码块呢?我想应该是这样的:首先对程序来讲同步的部分很影响运行效率,而一个方法通常是先创建一些局部变 量,再对这些变量做一些 操作,如运算,显示等等;而同步所覆盖的代码越多,对效率的影响就越严重。因此我们通常尽量缩小其影响范围。 如何做?同步代码块。我们只把一个方法中该同 步的地方同步,比如运算。          另外,同步代码块可以指定钥匙这一特点有个额外的好处,是可以在一定时期内霸占某个对象的key。还记得前面说过普通情况下钥 匙的使用原则吗。现在不是普通情况了。你所取得的那把钥匙不是永远不还,而是在退出同步代码块时才还。           还用前面那个想连续用两个上锁房间的家伙打比方。怎样才能在用完一间以后,继续使用另一间呢。用同步代码块吧。先创建另外 一个线程,做一个同步代码 块,把那个代码块的锁指向这个房子的钥匙。然后启动那个线程。只要你能在进入那个代码块时抓到这房子的钥匙 ,你就可以一直保留到退出那个代码块。也就是说 你甚至可以对本房内所有上锁的房间遍历,甚至再sleep(10601000),而房门口却还有 1000个线程在等这把钥匙呢。很过瘾吧。           在此对sleep()方法和钥匙的关联性讲一下。一个线程在拿到key后,且没有完成同步的内容时,如果被强制sleep()了,那key还一 直在 它那儿。直到它再次运行,做完所有同步内容,才会归还key。记住,那家伙只是干活干累了,去休息一下,他并没干完他要干的事。为 了避免别人进入那个房间 把里面搞的一团糟,即使在睡觉的时候他也要把那唯一的钥匙戴在身上。           最后,也许有人会问,为什么要一把钥匙通开,而不是一个钥匙一个门呢?我想这纯粹是因为复杂性问题。一个钥匙一个门当然更 安全,但是会牵扯好多问题。钥匙 的产生,保管,获得,归还等等。其复杂性有可能随同步方法的增加呈几何级数增加,严重影响效率。这也 算是一个权衡的问题吧。为了增加一点点安全性,导致效 率大大降低,是多么不可取啊。 synchronized的一个简单例子 public class TextThread { public static void main(String[] args) {    TxtThread tt = new TxtThread();    new Thread(tt).start();    new Thread(tt).start();    new Thread(tt).start();    new Thread(tt).start(); } } class TxtThread implements Runnable { int num = 100; String str = new String(); public void run() {    synchronized (str) {     while (num > 0) {      try {       Thread.sleep(1);      } catch (Exception e) {       e.getMessage();      }      System.out.println(Thread.currentThread().getName()        + "this is " + num--);     }    } } } 上面的例子中为了制造一个时间差,也就是出错的机会,使用了Thread.sleep(10) Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如 何?――还得对synchronized关键字的作用进行深入了解才可定论。 总的说来,synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分类, synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。 在进一步阐述之前,我们需要明确几点: A.无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其 他线程的对象访问。 B.每个对象只有一个锁(lock)与之相关联。 C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。 接着来讨论synchronized用到不同地方对代码产生的影响: 假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都可以调用它们。 1. 把synchronized当作函数修饰符时,示例代码如下: Public synchronized void methodAAA() { //…. } 这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中 执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了 synchronized关键字的方法。 上边的示例代码等同于如下代码: public void methodAAA() { synchronized (this)      // (1) {        //….. } } (1)处的this指的是什么呢?它指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个 拿到了P1对象锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造 成数据混乱:( 2.同步块,示例代码如下: public void method3(SomeObject so) {     synchronized(so)     {        //…..     } } 这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明 确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁: class Foo implements Runnable {         private byte[] lock = new byte[0]; // 特殊的instance变量         Public void methodA()         {            synchronized(lock) { //… }         }         //….. } 注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。 3.将synchronized作用于static 函数,示例代码如下: Class Foo {     public synchronized static void methodAAA()   // 同步的static 函数     {         //….     }     public void methodBBB()     {        synchronized(Foo.class)   // class literal(类名称字面常量)     } }    代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这 个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。 记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样,不能用P1.getClass()来达到锁这个Class的 目的。P1指的是由Foo类产生的对象。 可以推断:如果一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj 在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样。A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class。 小结如下: 搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。 还有一些技巧可以让我们对共享资源的同步访问更加安全: 1. 定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以 绕过同步方法的控制而直接取得它,并改动它。这也是JavaBean的标准实现方式之一。 2. 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象 的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。 这个时候就需要将get方法也加上synchronized同步,并 且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了 作者:hanwei_java 来源:CSDN 原文:https://blog.csdn.net/hanwei_java/article/details/79738614 版权声明:本文为博主原创文章,转载请附上博文链接!

auto_answer 2019-12-02 01:50:26 0 浏览量 回答数 0

回答

Python 用POP接收邮件一、简介  POP(Post Office Protocal)最长用的POP版本是POP3,因此本文是以POP3为主。POP3非常简单,可以用来从邮件服务器上下载邮件,然后删除这些邮件。功能非常有限,后面讲解的IMAP完胜它,不过作为入门级的,还是有必要介绍一下,也对学习SMTP有帮助。  Python提供了poplib模块,它提供了使用POP的便利接口。二、实例  由于pop3功能较IMAP非常有限,而且我最后的程序并没有使用pop3,所以,不详细讲解,下面通过一个例子来说明下较为常见的功能。  这个例子的功能为进入邮箱,查看所有的邮件。首先显示邮件的发件人、主题,查看邮箱主题内容。需要模块import email, poplib, sys连接POP3服务器,登录个人邮箱账户  poplib提供POP3()方法和POP3_SSL()方法连接POP3服务器,区别和SMTP一样。gmail仍然使用POP3_SSL()方式,并返回class POP3实例p = poplib.POP3_SSL('pop.gmail.com')   使用POP3.user(), POP3.pass_()方法来登录个人账户try:p.user(user) p.pass_(passwd)except poplib.error_proto: #可能出现的异常print('login failed')现在已经进入个人账户,下一步,利用POP3.list()函数查看邮箱内邮件信息。  关于list()函数的详细说明,请点击这里。list()函数有三个返回值,分别是:response, listings, octetsresponse 应答信息,我测试中出现的结果:      以b开头的字符串是Byte类型,我在实际测试的时候,返回的信息几乎都是Byte类型的。关于此类型及和普通字符串的转化会在后面举例说明。listings 是形如['message_id message_size',...]若干各message-id和message_size构成的list。后面就是通过message_id来检索邮件。我测试中出现的结果:  octets 不是特别清楚啥意思。response, listings, octets = p.list()最重要的就是listings数据  如上面解释的,listings是个list类型的数据,接下来我们取出listings中的message_id,也就是上面的 "1" "2" "3" "4" ...for listing in listings: #每次需要一个listingnumber, size = listing.split() #由于number和size是以空格分隔,所以利用split()函数分开,split()默认以' '为分隔  现在我们就取出了我们需要的message_id,也就是number,注意number需要从Byte类型转化为字符串类型。POP3.top()函数  利用此函数,取出邮件的headers,如下:response, lines, octets = p.top(number , 0)  lines存储内容,下面先转化成Message类型(lines默认为标准字符串类型,仅供说明,以实际代码为准)message = email.message_from_string('n'.join(lines))已经生成Message类,可以利用头部信息来查看From, Subject等信息for header in 'From', 'To', 'Subject', 'Date':if header in message: print(header + ':' , message[header])   注意,此时的message[header]可能不会输出我们想看到的内容,有可能出现格式错乱问题,比如中英文的转化,所以还需要特殊来处理。处理方式请继续往下看IMAP部分。取出邮件所有信息  上面的top()函数只取出header信息以及根据参数确定的n行内容,如果用户希望查看邮件所有内容,那利用POP3.retr()函数取出response, lines, octets = p.retr(number)  还是将lines中的内容转换成Message类型:message = email.message_from_string('n'.join(lines))已经有了邮件所有信息,可以通过Message.get_payload()取出邮件正文了。  但是,get_payload()函数并不一定返回邮件正文。以下是官方说明:Return the current payload, which will be a list of Message objects when is_multipart() is True, or a string when is_multipart() is False.   在实际测试中,返回的就是a list of Message objects,这个问题困扰我很长时间,最终还是解决了,通过以下方法:复制代码maintype = message.get_content_maintype()if maintype == 'multipart':for part in message.get_payload(): if part.get_content_maintype() == 'text': mail_content = part.get_payload(decode=True).strip()elif maintype == 'text':mail_content = e.get_payload(decode=True).strip() 复制代码此时,mail_content就是邮件正文了.  当然,如果是中文的话,这件事仍未完,还需要将它转化未'gbk',利用如下方式:mail_content = mail_content.decode('gbk')到现在,基本已经大功告成了,能够取出邮箱中所有的邮件,并查看邮件的header内容和邮件正文了^_^三、完整代码:复制代码-- encoding:utf-8 ---- encoding:gbk --import email, getpass, poplib, syshostname = 'pop.gmail.com'user = 'myUserName@gmail.com'passwd = '*'p = poplib.POP3_SSL('pop.gmail.com') #与SMTP一样,登录gmail需要使用POP3_SSL() 方法,返回class POP3实例try:# 使用POP3.user(), POP3.pass_()方法来登录个人账户 p.user(user) p.pass_(passwd)except poplib.error_proto: #可能出现的异常print('login failed')else:response, listings, octets = p.list() for listing in listings: number, size = listing.split() #取出message-id number = bytes.decode(number) size = bytes.decode(size) print('Message', number, '( size is ', size, 'bytes)') print() response, lines, octets = p.top(number , 0) # 继续把Byte类型转化成普通字符串 for i in range(0, len(lines)): lines[i] = bytes.decode(lines[i]) #利用email库函数转化成Message类型邮件 message = email.message_from_string('\n'.join(lines)) # 输出From, To, Subject, Date头部及其信息 for header in 'From', 'To', 'Subject', 'Date': if header in message: print(header + ':' , message[header]) #与用户交互是否想查看邮件内容 print('Read this message [ny]') answer = input() if answer.lower().startswith('y'): response, lines, octets = p.retr(number) #检索message并返回 for i in range(0, len(lines)): lines[i] = bytes.decode(lines[i]) message = email.message_from_string('\n'.join(lines)) print('-' * 72) maintype = message.get_content_maintype() if maintype == 'multipart': for part in message.get_payload(): if part.get_content_maintype() == 'text': mail_content = part.get_payload(decode=True).strip() elif maintype == 'text': mail_content = e.get_payload(decode=True).strip() try: mail_content = mail_content.decode('gbk') except UnicodeDecodeError: print('Decoding to gbk error') sys.exit(1) print(mail_content) print() print('Delete this message? [ny]') answer = input() if answer.lower().startswith('y'): p.dele(number) print('Deleted')finally:print('log out') p.quit()

xuning715 2019-12-02 01:10:36 0 浏览量 回答数 0

问题

10个迷惑新手的Cocoa,Objective-c开发难点和问题? 400 报错

爱吃鱼的程序员 2020-05-31 00:44:29 0 浏览量 回答数 1

问题

第6篇 指针数组字符串(下):报错

kun坤 2020-06-08 11:01:44 4 浏览量 回答数 1

回答

Mixin的缺陷: 组件与Mixin之间存在隐式依赖(Mixin经常依赖组件的特定⽅法,但在定义组件时并不知道这种依赖关系)多个Mixin之间可能产⽣冲突(⽐如定义了相同的state字段)Mixin倾向于增加更多状态,这降低了应⽤的可预测性(The more state in your application, the harder it is to reason about it.),导致复杂度剧增隐式依赖导致依赖关系不透明,维护成本和理解成本迅速攀升: 难以快速理解组件⾏为,需要全盘了解所有依赖Mixin的扩展⾏为,及其之间的相互影响组价⾃身的⽅法和state字段不敢轻易删改,因为难以确定有没有Mixin依赖它Mixin也难以维护,因为Mixin逻辑最后会被打平合并到⼀起,很难搞清楚⼀个Mixin的输⼊输出 HOC相⽐Mixin的优势: HOC通过外层组件通过Props影响内层组件的状态,⽽不是直接改变其State不存在冲突和互相⼲扰,这就降低了 耦合度不同于Mixin的打平+合并,HOC具有天然的层级结构(组件树结构),这⼜降低了复杂度 HOC的缺陷: 扩展性限制: HOC⽆法从外部访问⼦组件的State因此⽆法通过shouldComponentUpdate滤掉不必要的更新,React在⽀持ES6 Class之后提供了React.PureComponent来解决这个问题Ref传递问题: Ref被隔断,后来的React.forwardRef来解决这个问题Wrapper Hell:HOC可能出现多层包裹组件的情况,多层抽象同样增加了复杂度和理解成本命名冲突: 如果⾼阶组件多次嵌套,没有使⽤命名空间的话会产⽣冲突,然后覆盖⽼属性不可⻅性: HOC相当于在原有组件外层再包装⼀个组件,你压根不知道外层的包装是啥,对于你是⿊盒 Render Props优点: 上述HOC的缺点Render Props都可以解决 Render Props缺陷: 使⽤繁琐: HOC使⽤只需要借助装饰器语法通常⼀⾏代码就可以进⾏复⽤,Render Props⽆法做到如此简单嵌套过深: Render Props虽然摆脱了组件多层嵌套的问题,但是转化为了函数回调的嵌套 React Hooks优点: 简洁: React Hooks解决了HOC和Render Props的嵌套问题,更加简洁解耦: React Hooks可以更⽅便地把 UI 和状态分离,做到更彻底的解耦组合: Hooks 中可以引⽤另外的 Hooks形成新的Hooks,组合变化万千函数友好: React Hooks为函数组件⽽⽣,从⽽解决了类组件的⼏⼤问题: this指向容易错误分割在不同声明周期中的逻辑使得代码难以理解和维护代码复⽤成本⾼(⾼阶组件容易使代码量剧增) React Hooks缺陷: 额外的学习成本(Functional Component 与Class Component之间的困惑)写法上有限制(不能出现在条件、循环中),并且写法限制增加了重构成本破坏了PureComponent、React.memo浅⽐较的性能优化效果(为了取最新的props和state,每次render()都要重新创建事件处函数)在闭包场景可能会引⽤到旧的state、props值内部实现上不直观(依赖⼀份可变的全局状态,不再那么“纯”)React.memo并不能完全替代shouldComponentUpdate(因为拿不到state change,只针对 props change)

前端问答 2019-12-02 03:24:17 0 浏览量 回答数 0

回答

点击某一个函数名,会读取整个文档并弹出子窗口显示 - 这个无论是用原生js还是jquery都可以简单快速做到 定位到选择的函数 - 这个我认为做个锚就行了,如果不太清楚锚是干嘛的,可以参考一下这个  html 网页中的锚点的使用介绍 ######我知道锚,但问题是读取的文档是一个后台的方法类,无法也不能添加锚点...###### 你想搞一个方便从html页面中快速查看 某个语言的函数文档吧。 类似于语言手册一样方便,或者是自己项目文档。 例如,这样一个列表。 json_decode json_encode 点击后会用 js window.open, 指定大小的新窗口打对应的链接。 如 点击 json_decode 弹开 http://php.net/manual/zh/function.json-decode.php ######是的,但就是不知道怎样定位到点击的函数方法######phpDesigner编辑器, 可以直接关连手册. ######回复 @ZeronoFreya : 用 class来选择 例如列表 <div class="my_list"><ul><li>json_decode</li>....</ul></div> Jquery 选择就写成 $('.my_list > ul > li').click(function(){ open new window}); 或者直接就给函数列表加上某个class名 直接用 $('.my_li')选择就成了。 哈哈,不知道你问是不是这样的。######很遗憾不是的...简单来说就是读取一篇文档,但你不能修改其内容,里面有一些关键字,在html里有对应的链接(其实没对应),单击连接后定位到关键字所在行... 类似查找功能######回复 @ZeronoFreya : 就是百度百科中的关键词连接一样对吧。 又不能改html,你怎么知道一段html里某个是关键词。 保存文档没有这个关键词链接,只能在web返回页面时加上,才是你说不能修改html原因吧。 用php把关键词替换成超链接或者加个<span>标签。 ------------------------------------------------------ 问的不清楚,估计连你自己都不知道要写成什么样的。###### 引用来自“dworry”的评论回复 @ZeronoFreya : 就是百度百科中的关键词连接一样对吧。 又不能改html,你怎么知道一段html里某个是关键词。 保存文档没有这个关键词链接,只能在web返回页面时加上,才是你说不能修改html原因吧。 用php把关键词替换成超链接或者加个<span>标签。 ------------------------------------------------------ 问的不清楚,估计连你自己都不知道要写成什么样的。 无法编辑问题真的很.... 请原谅我不及格的语文成绩... 比如html中是这样的: <ul> <li>hahaha</li> <li>...</li> </ul> 后台控制器,不能改 ... function hahaha(){ ... } ... 当我点击<li>hahaha</li>时,会把整个后台控制器作为文本文档读取到变量中, 然后append到<mycode></mycode>,将包含此自定义标签的Div显示(模拟子窗口), 这时就显示了后台控制器的所有方法, 然后,定位到hahaha这个方法所在行... (别问我为啥这么做,上面要求的) 基本来说,就是做一个后台控制器方法的预览器,无修改能力,但必须要同步...所以采用了读取后台控制器文档的方法,所以绝对不能动后台控制器的脑筋 现在我能想到的就是一般文本编辑器所具有的查找功能,但不知道具体如何实现,百度一堆都是调用了一个函数,然后就没了,老实说,我想要的是思路...跑题了 ###### 引用来自“dworry”的评论 回复 @ZeronoFreya : 就是百度百科中的关键词连接一样对吧。 又不能改html,你怎么知道一段html里某个是关键词。 保存文档没有这个关键词链接,只能在web返回页面时加上,才是你说不能修改html原因吧。 用php把关键词替换成超链接或者加个<span>标签。 ------------------------------------------------------ 问的不清楚,估计连你自己都不知道要写成什么样的。 引用来自“ZeronoFreya”的评论 无法编辑问题真的很.... 请原谅我不及格的语文成绩... 比如html中是这样的: <ul> <li>hahaha</li> <li>...</li> </ul> 后台控制器,不能改 ... function hahaha(){ ... } ... 当我点击<li>hahaha</li>时,会把整个后台控制器作为文本文档读取到变量中, 然后append到<mycode></mycode>,将包含此自定义标签的Div显示(模拟子窗口), 这时就显示了后台控制器的所有方法, 然后,定位到hahaha这个方法所在行... (别问我为啥这么做,上面要求的) 基本来说,就是做一个后台控制器方法的预览器,无修改能力,但必须要同步...所以采用了读取后台控制器文档的方法,所以绝对不能动后台控制器的脑筋 现在我能想到的就是一般文本编辑器所具有的查找功能,但不知道具体如何实现,百度一堆都是调用了一个函数,然后就没了,老实说,我想要的是思路...跑题了 就是在线版的 ctage 你用过 sublime text + ctage 或者 是 gvim + ctage 代码跳转的。 ctage 在项目文档中生成 .tage 文本,(看下面是我项目中生成的.tage一段内容) 你可以根据这段内容来定位到要读取的代码。 secure_cookie .\system\core\Security.php /^ $secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0;$/;" v security .\system\core\Input.php /^ $this->security =& $SEC;$/;" v see_json .\application\helpers\common_helper.php /^ function see_json($json) {$/;" f segment .\system\core\URI.php /^ function segment($n, $no_result = FALSE)$/;" f segment_array .\system\core\URI.php /^ $segment_array = 'rsegment_array';$/;" v segment_array .\system\core\URI.php /^ $segment_array = 'segment_array';$/;" v 如我定义的 see_json 函数 第一列是函数名, 第二列是所在文件, 第三个是正则函数名所有行。 see_json    .\application\helpers\common_helper.php    /^    function see_json($json) {$/;"    f 可以在本地生成 .tage文件与代码一起提交上去。 只要写个php解析这个.tage文件最行了。 ######谢谢,我研究一下

kun坤 2020-06-06 15:30:57 0 浏览量 回答数 0

问题

聊聊 Laravel 5.5 的 「自动发现」和此刻心情

ThinkSNS 2019-12-01 21:29:03 2097 浏览量 回答数 1

问题

Java技术1000问(3)【精品问答】

问问小秘 2020-06-02 14:27:10 42 浏览量 回答数 1

回答

" List是饭,饭有很多种,这是一个泛指。 比如ArrayList是米饭,LinkedList是包子,Vector是面条,诸如此类,还有很多,它们都继承了List接口,为List的实现类。 至于好处么,你声明一个方法 method(List list); 告诉其它开发人员,这个地方能传入一个List类型的对象,那么别人可以随意传递ArrayList或LinkedList或者自己实现的类,当然它只要符合List的要求就行了。就好比说,你要吃饭,那么随便给你包子面条自己应付就可以了。换而言之,你说你要吃面条,你搞个这样的方法 method(ArrayList list);这样的话别人只能够传递ArrayList类型的对象给你。 至于为啥个要这么做,List接口下的实现类各有不同,有的线程安全,有的速度更快,适用场合不同。但是它们都符合List定义的要求,而你的method(List list);得到这个对象之后,一样可以按照List提供的方法用它了,只管拿筷子吃它就可以了 但是你要是移动开发的话或许应该这样 ArrayList list = new ArrayList();  Map map = new HashMap(); 因为记得在哪里看到过一篇文章说如此能提升性能。。 ######不错,我都明白了,很透彻哈######面向接口编程,防止你那天想把Arraylist 改成linkedlist.######如果这样改了.B的声明方式还是需要改噻######0.0,蛋疼。。这样改~~###### 简单地说,A更短一些,更环保。 复杂点说,倡导面向接口编程。 ######这,。。。面向接口的方式只是更灵活,你还不是面向对象编程######以前不是面向对象吗?怎么现在变成面向接口啊?(⊙o⊙)…######     B方式不是容易出错,List 本是一个接口,你传一个什么样的实现类,他就代表对应的实现类,如果你传入的是一个LinkedList,那么这个list就代表着LinkedList, 它由其实现类决定的 ###### 函数内部声明和调用区别不大,如果是作为参数传递的时候用就接口就体现出灵活性了 public int getMaxNum(List numList){ //这样写同样的逻辑,可以处理ArrayList也可以处理LinkedList return 0; } ######这个还可以。相当于用个大范围的东东放在那,只是是下面的子集均正确######哦~~~~~,这个得试试######上溯造型######囧rz###### 如果你的这个list需要在一些类库中进行处理,那么使用接口效果肯定要比使用具体的类效果好。因为类库一般都会尽可能的抽象,以便适应多种情形。具体编程的时候,也应该尽可能的在声明的时候使用抽象的接口,这样更加的灵活。 其实你在具体写程序的时候,在方法内部的声明不怎么重要,但是如你的例子,你这个是类的字段,这个还是要注意的。 ######字段是神马额?######2楼很真理了。######:)###### 真正狗价师就了解了,一个开发初期只能确定一些基本实体对象的属性,为了便于扩展往往用抽象的接口代替。但是随着开发进展肯定会有更多的特性加入,如果初期使用抽象定义,那么这些代码完全不用更改就可以兼容后面东西。 ######恩######list是接口,一个接口可以不多个实现类,你可以用arraylist,也可以用linkedList实现"

kun坤 2020-05-26 13:12:25 0 浏览量 回答数 0

问题

【今日算法】4月24日-如何寻找最长回文子串

游客ih62co2qqq5ww 2020-04-24 22:54:34 0 浏览量 回答数 0

问题

dubbo的oninvoke问题?报错

爱吃鱼的程序员 2020-06-06 15:27:54 0 浏览量 回答数 1

问题

【精品问答】大数据技术、大数据计算五十问第一期

问问小秘 2019-12-01 21:51:57 100 浏览量 回答数 1

问题

MaxCompute百问集锦(持续更新20171011)

隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

问题

SSH面试题

琴瑟 2019-12-01 21:46:22 3489 浏览量 回答数 0

回答

printf("aaa\n");这不是在打印a字符吗?,而且,只有段越界才会引起进程的段错误信号,你访问的地址仍然在进程的合法空间范围内,当然空指针这类地址基本不合法。回复 @xxdd:看看gdb进程的infoprocmappings或者去cat/proc/$pid/maps,崩溃指的是程序read,write,execute了一个virtualaddress,这个address不在操作系统给其进程分配的虚拟地址段之内,称其为段错误回复 @xxdd:我的理解是,只有当指针指向只读区域时,你更改才会报错。想想八门神器,一个程序都可以改别的程序里的内存值,这不就很好的解释了你的疑问了吗?您好,我指的是fun()函数里面的n[111],已经越界了,为什么程序可以正常运行,而不是崩溃? 因为根本报不了错。 编译器,编译器怎么判断数组下标的范围?没有任何一种万无一失的方法,最多用静态检查工具,处理掉一些错误。 运行期,程序持有的信息更少,数组元素的访问就是数组其实元素的地址+偏移量计算出地址。这个时候就是对地址的直接访问,运行期是不会记录类型信息的,根本不知道这个数组设定的大小。这个时候程序是否崩溃就要看人品了,只有操作系统发现你访问了不该访问的内存区域,程序才会崩溃。谢谢,应该是这样的。c++本来就不会检查边界的,所以遇到数组参数的时候,一般会加一个长度,而java是基于这个问题做了优化编译器不检查,但是为什么运行的时候,也不报错? 数组下标越界是undefinedbehavior. 结果是未定义的知道什么意思吧 两种写法程序都可以正常运行,为啥?明明操作了非法的地址。越界是 undefinedbehavior。所谓 undefinedbehavior就是怎样都行,可以崩溃、可以什么都不干。你如果非要问为什么C++这样规定,那是因为检查这些错误代价实在太大了。您好,我想知道的是,为什么这个程序可以正常运行?数组已经指向了非法的地址。数组传递变成指针,他允许你进行修改,改的对不对成了问题 你把堆改成栈再试试回复 @xxdd:堆所分配的是系统中剩余的可用内存。new出来的内存指针所指向的地址,在你指定的大小之后,仍然可能有很大一块可用内存,不报错是有可能的。inta[2];fun(a);这个就是栈吧?这应该和系统内存分配有关系吧,报错应该是系统认为地址非法给你报错,系统肯定是认为你这个地址不非法呗,所以不报错newint[2]是从堆上分配的,数组越界是未定义行为,可能是没有进程默认堆大,没有非法访问,所以没有coredump掉。你越界大一些看看好像是这个原因,那栈上那个为什么也不报错? 楼主听说过“缓冲区溢出”的说法吧 我个人理解一个指针本来就能在自己的地盘里指来指去,想要指到哪里是程序员的自由,编译器不做这方面的任何限制与检查。 Linux上检查缓冲区溢出跟内存泄露可以试试valgrind还有电网electric-fence

爱吃鱼的程序员 2020-06-12 14:05:26 0 浏览量 回答数 0

回答

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 一个进程可以开多个线程 默认是进程管理 默认有一个主进程 Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下 3、单例模式 单例模式需求:只能实例化产生一个对象 如何实现: 私有化构造函数 禁止克隆对象 提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象 需要一个保存类的静态属性 class demo { private static $MyObject; //保存对象的静态属性 private function __construct(){ //私有化构造函数 } private function __clone(){ //禁止克隆 } public static function getInstance(){ if(! (self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } 4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理 5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的 function one($str1, $str2) { two("Glenn", "Quagmire"); } function two($str1, $str2) { three("Cleveland", "Brown"); } function three($str1, $str2) { print_r(debug_backtrace()); } one("Peter", "Griffin"); Array ( [0] => Array ( [file] => D:\www\test\result.php [line] => 9 [function] => three [args] => Array ( [0] => Cleveland [1] => Brown ) ) [1] => Array ( [file] => D:\www\test\result.php [line] => 5 [function] => two [args] => Array ( [0] => Glenn [1] => Quagmire ) ) [2] => Array ( [file] => D:\www\test\result.php [line] => 16 [function] => one [args] => Array ( [0] => Peter [1] => Griffin ) ) ) 6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间 echo $ip=getenv('REMOTE_ADDR'); $ip=str_replace('.','',$ip); if($ip<1921681150 && $ip>1921681100) { echo 'ip在192.168.1.100—–192.168.1.150之间'; } else { echo 'ip不在192.168.1.100—–192.168.1.150之间'; } 7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值 $tarray = array( array('id' => 0, 'name' => '123'), array('id' => 0, 'name' => '1234'), array('id' => 0, 'name' => '1235'), array('id' => 0, 'name' => '12356'), array('id' => 0, 'name' => '123abc') ); foreach($tarray as $key=>$val) { $c[]=$val['name']; } function aa($a,$b) { if(strlen($a)==strlen($b)) return 0; return strlen($a)>strlen($b)?-1:1; } usort($c,'aa'); $len=count($c); for($i=0;$i<$len;$i++) { $t[$i]['id']=$i+1; $t[$i]['name']=$c[$i]; } print_r($t); 8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少? POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。 9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历 SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。 10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么 索引用来快速地寻找那些具有特定值的记录。 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。 索引的缺点: 1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。 3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案 瓶颈主要有: 1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存 4、内存带宽 12、include和require区别 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 13、文件上传时设计到点 和文件上传有关的php.ini配置选项(File Uploads): file_uploads=On/Off:文件是否允许上传 upload_max_filesize上传文件时,单个文件的最大大小 post_max_size:提交表单时,整个post表单的最大大小 max_file_uploads =20上传文件的个数 内存占用,脚本最大执行时间也间接影响到文件的上传 14、header常见状态 //200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富 15、ORM和ActiveRecord ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑; ActiveRecord比较适用于: 1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发。 16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么 function fibonacci($n){ if($n == 0){ return 0; } if($n == 1){ return 1; } return fibonacci($n-1)+fibonacci($n-2); } function fibonacci($n){ for($i=0; $i<$n; $i++){ $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2]; } return $r[--$i]; } 17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。 function yuesefu($n,$m) { $r=0; for($i=2; $i<=$n; $i++) { $r=($r+$m)%$i; } return $r+1; } 18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 function bubbleSort($arr){ for($i=0, $len=count($arr); $i<$len; $i++){ for($j=0; $j<$len; $j++){ if($arr[$i]<$arr[$j]){ $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } 19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 function quickSort($arr){ $len = count($arr); if($len <=1){ return $arr; } $key = $arr[0]; $leftArr = $rightArr= array(); for($i=1; $i<$len; $i++){ if($arr[$i] <= $key){ $leftArr[] = $arr[$i]; } else{ $rightArr[] = $arr[$i]; } } $leftArr = quickSort($leftArr); $rightArr = quickSort($rightArr); return array_merge($leftArr, array($key), $rightArr); } 20、(递归的)列出目录下所有文件及目录,这里也有两种方法 function listDir($path){ $res = dir($path); while($file = $res->read()){ if($file == '.' || $file == '..'){ continue; } if(is_dir($path . '/' .$file)){ echo $path . '/' .$file . "\r\n"; listDir($path . '/' .$file); } else{ echo $path . '/' .$file . "\r\n"; } } $res->close(); } function listDir($path){ if(is_dir($path)){ if(FALSE !== ($res = opendir($path))){ while(FALSE !== ($file = readdir($res))){ if($file == '.' || $file == '..'){ continue; } $subPath = $path . '/' . $file; if(is_dir($subPath)){ echo $subPath . "\r\n"; listDir($subPath); } else{ echo $subPath . "\r\n"; } } } } } 21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/ function ralativePath($a, $b){ $a = explode('/', dirname($a)); $b = explode('/', dirname($b)); $c = '/'; foreach ($a as $k=> $v){ if($v != $b[$k]){ $c .= $v . '/'; } } echo $c; } 22、快速找出url中php后缀 function get_ext($url){ $data = parse_url($url); return pathinfo($data['path'], PATHINFO_EXTENSION); } 23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录 function preg_meta($meta){ $replacement = "\\1utf8\\6\\7"; $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i'; return preg_replace($pattern, $replacement, $meta); } echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>"); 24、不用php的反转函数倒序输出字符串,如abc,反序输出cba function revstring($str){ for($i=strlen($str)-1; $i>=0; $i--){ echo $str{$i}; } } revstring('abc'); 25、常见端口 TCP 21端口:FTP 文件传输服务 SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备 TCP 23端口:TELNET 终端仿真服务 TCP 25端口:SMTP 简单邮件传输服务 UDP 53端口:DNS 域名解析服务 TCP 80端口:HTTP 超文本传输服务 TCP 110端口:POP3 “邮局协议版本3”使用的端口 TCP 443端口:HTTPS 加密的超文本传输服务 TCP 1521端口:Oracle数据库服务 TCP 1863端口:MSN Messenger的文件传输功能所使用的端口 TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口 TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口 UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口 TCP 5000端口:MS SQL Server使用的端口 UDP 8000端口:腾讯QQ 26、linux常用的命令 top linux进程实时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中。 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量 第六,使用流量分析统计软件 28、$_SERVER常用的字段 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称 $_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT” $_SERVER['QUERY_STRING'] #查询(query)的字符串 $_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容 $_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址 $_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址 $_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名 $_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名 $_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用 $_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html” 29、安装php扩展 进入扩展的目录 phpize命令得到configure文件 ./configure --with-php-config=/usr/local/php/bin/php-config make & make install 在php.ini中加入扩展名称.so 重启web服务器(nginx/apache) 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。 FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。 31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)

小川游鱼 2019-12-02 01:41:29 0 浏览量 回答数 0

回答

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 一个进程可以开多个线程 默认是进程管理 默认有一个主进程 Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下 3、单例模式 单例模式需求:只能实例化产生一个对象 如何实现: 私有化构造函数 禁止克隆对象 提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象 需要一个保存类的静态属性 class demo { private static $MyObject; //保存对象的静态属性 private function __construct(){ //私有化构造函数 } private function __clone(){ //禁止克隆 } public static function getInstance(){ if(! (self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } 4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理 5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的 function one($str1, $str2) { two("Glenn", "Quagmire"); } function two($str1, $str2) { three("Cleveland", "Brown"); } function three($str1, $str2) { print_r(debug_backtrace()); } one("Peter", "Griffin"); Array ( [0] => Array ( [file] => D:\www\test\result.php [line] => 9 [function] => three [args] => Array ( [0] => Cleveland [1] => Brown ) ) [1] => Array ( [file] => D:\www\test\result.php [line] => 5 [function] => two [args] => Array ( [0] => Glenn [1] => Quagmire ) ) [2] => Array ( [file] => D:\www\test\result.php [line] => 16 [function] => one [args] => Array ( [0] => Peter [1] => Griffin ) ) ) 6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间 echo $ip=getenv('REMOTE_ADDR'); $ip=str_replace('.','',$ip); if($ip<1921681150 && $ip>1921681100) { echo 'ip在192.168.1.100—–192.168.1.150之间'; } else { echo 'ip不在192.168.1.100—–192.168.1.150之间'; } 7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值 $tarray = array( array('id' => 0, 'name' => '123'), array('id' => 0, 'name' => '1234'), array('id' => 0, 'name' => '1235'), array('id' => 0, 'name' => '12356'), array('id' => 0, 'name' => '123abc') ); foreach($tarray as $key=>$val) { $c[]=$val['name']; } function aa($a,$b) { if(strlen($a)==strlen($b)) return 0; return strlen($a)>strlen($b)?-1:1; } usort($c,'aa'); $len=count($c); for($i=0;$i<$len;$i++) { $t[$i]['id']=$i+1; $t[$i]['name']=$c[$i]; } print_r($t); 8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少? POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。 9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历 SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。 10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么 索引用来快速地寻找那些具有特定值的记录。 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。 索引的缺点: 1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。 3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案 瓶颈主要有: 1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存 4、内存带宽 12、include和require区别 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 13、文件上传时设计到点 和文件上传有关的php.ini配置选项(File Uploads): file_uploads=On/Off:文件是否允许上传 upload_max_filesize上传文件时,单个文件的最大大小 post_max_size:提交表单时,整个post表单的最大大小 max_file_uploads =20上传文件的个数 内存占用,脚本最大执行时间也间接影响到文件的上传 14、header常见状态 //200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富 15、ORM和ActiveRecord ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑; ActiveRecord比较适用于: 1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发。 16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么 function fibonacci($n){ if($n == 0){ return 0; } if($n == 1){ return 1; } return fibonacci($n-1)+fibonacci($n-2); } function fibonacci($n){ for($i=0; $i<$n; $i++){ $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2]; } return $r[--$i]; } 17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。 function yuesefu($n,$m) { $r=0; for($i=2; $i<=$n; $i++) { $r=($r+$m)%$i; } return $r+1; } 18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 function bubbleSort($arr){ for($i=0, $len=count($arr); $i<$len; $i++){ for($j=0; $j<$len; $j++){ if($arr[$i]<$arr[$j]){ $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } 19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 function quickSort($arr){ $len = count($arr); if($len <=1){ return $arr; } $key = $arr[0]; $leftArr = $rightArr= array(); for($i=1; $i<$len; $i++){ if($arr[$i] <= $key){ $leftArr[] = $arr[$i]; } else{ $rightArr[] = $arr[$i]; } } $leftArr = quickSort($leftArr); $rightArr = quickSort($rightArr); return array_merge($leftArr, array($key), $rightArr); } 20、(递归的)列出目录下所有文件及目录,这里也有两种方法 function listDir($path){ $res = dir($path); while($file = $res->read()){ if($file == '.' || $file == '..'){ continue; } if(is_dir($path . '/' .$file)){ echo $path . '/' .$file . "\r\n"; listDir($path . '/' .$file); } else{ echo $path . '/' .$file . "\r\n"; } } $res->close(); } function listDir($path){ if(is_dir($path)){ if(FALSE !== ($res = opendir($path))){ while(FALSE !== ($file = readdir($res))){ if($file == '.' || $file == '..'){ continue; } $subPath = $path . '/' . $file; if(is_dir($subPath)){ echo $subPath . "\r\n"; listDir($subPath); } else{ echo $subPath . "\r\n"; } } } } } 21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/ function ralativePath($a, $b){ $a = explode('/', dirname($a)); $b = explode('/', dirname($b)); $c = '/'; foreach ($a as $k=> $v){ if($v != $b[$k]){ $c .= $v . '/'; } } echo $c; } 22、快速找出url中php后缀 function get_ext($url){ $data = parse_url($url); return pathinfo($data['path'], PATHINFO_EXTENSION); } 23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录 function preg_meta($meta){ $replacement = "\\1utf8\\6\\7"; $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i'; return preg_replace($pattern, $replacement, $meta); } echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>"); 24、不用php的反转函数倒序输出字符串,如abc,反序输出cba function revstring($str){ for($i=strlen($str)-1; $i>=0; $i--){ echo $str{$i}; } } revstring('abc'); 25、常见端口 TCP 21端口:FTP 文件传输服务 SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备 TCP 23端口:TELNET 终端仿真服务 TCP 25端口:SMTP 简单邮件传输服务 UDP 53端口:DNS 域名解析服务 TCP 80端口:HTTP 超文本传输服务 TCP 110端口:POP3 “邮局协议版本3”使用的端口 TCP 443端口:HTTPS 加密的超文本传输服务 TCP 1521端口:Oracle数据库服务 TCP 1863端口:MSN Messenger的文件传输功能所使用的端口 TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口 TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口 UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口 TCP 5000端口:MS SQL Server使用的端口 UDP 8000端口:腾讯QQ 26、linux常用的命令 top linux进程实时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中。 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量 第六,使用流量分析统计软件 28、$_SERVER常用的字段 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称 $_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT” $_SERVER['QUERY_STRING'] #查询(query)的字符串 $_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容 $_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址 $_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址 $_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名 $_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名 $_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用 $_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html” 29、安装php扩展 进入扩展的目录 phpize命令得到configure文件 ./configure --with-php-config=/usr/local/php/bin/php-config make & make install 在php.ini中加入扩展名称.so 重启web服务器(nginx/apache) 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。 FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。 31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)

小川游鱼 2019-12-02 01:41:29 0 浏览量 回答数 0

问题

【算法】五分钟算法小知识:动态规划详解

游客ih62co2qqq5ww 2020-05-07 14:48:09 25 浏览量 回答数 1

问题

线性表 7月8日 【今日算法】

游客ih62co2qqq5ww 2020-07-09 07:47:37 504 浏览量 回答数 1

问题

从一道面试题谈谈一线大厂码农应该具备的基本能力 7月16日 【今日算法】

游客ih62co2qqq5ww 2020-07-22 13:45:47 118 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站