精华内容
下载资源
问答
  • 在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。关键是,不要认为给方法或者代码段...

    在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。

    关键是,不要认为给方法或者代码段加上synchronized就万事大吉,看下面一段代码:

    class Sync {

    public synchronized void test() {

    System.out.println("test开始..");

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    System.out.println("test结束..");

    }

    }

    class MyThread extends Thread {

    public void run() {

    Sync sync = new Sync();

    sync.test();

    }

    }

    public class Main {

    public static void main(String[] args) {

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

    Thread thread = new MyThread();

    thread.start();

    }

    }

    }

    运行结果:

    test开始..

    test开始..

    test开始..

    test结束..

    test结束..

    test结束..

    可以看出来,上面的程序起了三个线程,同时运行Sync类中的test()方法,虽然test()方法加上了synchronized,但是还是同时运行起来,貌似synchronized没起作用。

    将test()方法上的synchronized去掉,在方法内部加上synchronized(this):

    public void test() {

    synchronized(this){

    System.out.println("test开始..");

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    System.out.println("test结束..");

    }

    }

    运行结果:

    test开始..

    test开始..

    test开始..

    test结束..

    test结束..

    test结束..

    一切还是这么平静,没有看到synchronized起到作用。

    实际上,synchronized(this)以及非static的synchronized方法(至于static synchronized方法请往下看),只能防止多个线程同时执行同一个对象的同步代码段。

    回到本文的题目上:synchronized锁住的是代码还是对象。答案是:synchronized锁住的是括号里的对象,而不是代码。对于非static的synchronized方法,锁的就是对象本身也就是this。

    当synchronized锁住一个对象后,别的线程如果也想拿到这个对象的锁,就必须等待这个线程执行完成释放锁,才能再次给对象加锁,这样才达到线程同步的目的。即使两个不同的代码段,都要锁同一个对象,那么这两个代码段也不能在多线程环境下同时运行。

    所以我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步。这叫减小锁的粒度,使代码更大程度的并发。原因是基于以上的思想,锁的代码段太长了,别的线程是不是要等很久,等的花儿都谢了。当然这段是题外话,与本文核心思想并无太大关联。

    再看上面的代码,每个线程中都new了一个Sync类的对象,也就是产生了三个Sync对象,由于不是同一个对象,所以可以多线程同时运行synchronized方法或代码段。

    为了验证上述的观点,修改一下代码,让三个线程使用同一个Sync的对象。

    class MyThread extends Thread {

    private Sync sync;

    public MyThread(Sync sync) {

    this.sync = sync;

    }

    public void run() {

    sync.test();

    }

    }

    public class Main {

    public static void main(String[] args) {

    Sync sync = new Sync();

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

    Thread thread = new MyThread(sync);

    thread.start();

    }

    }

    }

    运行结果:

    test开始..

    test结束..

    test开始..

    test结束..

    test开始..

    test结束..

    可以看到,此时的synchronized就起了作用。

    那么,如果真的想锁住这段代码,要怎么做?也就是,如果还是最开始的那段代码,每个线程new一个Sync对象,怎么才能让test方法不会被多线程执行。

    解决也很简单,只要锁住同一个对象不就行了。例如,synchronized后的括号中锁同一个固定对象,这样就行了。这样是没问题,但是,比较多的做法是让synchronized锁这个类对应的Class对象。

    class Sync {

    public void test() {

    synchronized (Sync.class) {

    System.out.println("test开始..");

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    System.out.println("test结束..");

    }

    }

    }

    class MyThread extends Thread {

    public void run() {

    Sync sync = new Sync();

    sync.test();

    }

    }

    public class Main {

    public static void main(String[] args) {

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

    Thread thread = new MyThread();

    thread.start();

    }

    }

    }

    运行结果:

    test开始..

    test结束..

    test开始..

    test结束..

    test开始..

    test结束..

    上面代码用synchronized(Sync.class)实现了全局锁的效果。

    最后说说static synchronized方法,static方法可以直接类名加方法名调用,方法中无法使用this,所以它锁的不是this,而是类的Class对象,所以,static synchronized方法也相当于全局锁,相当于锁住了代码段。

    展开全文
  • 如今,我们会称呼Programmer“程序员(男)”或“程序媛(女)”,那么所谓的Code Monkey又是什么呢?字面意思是“代码猴子”?听起来,似乎有些许贬义色彩。 事实上,这的确是一个贬义词。 根据techopedia.com...
        

    图0:你知道程序猿为什么又叫“代码猴”吗?

    如今,我们会称呼Programmer为“程序员(男)”或“程序媛(女)”,那么所谓的Code Monkey又是什么呢?字面意思是“代码猴子”?听起来,似乎有些许贬义色彩。

    事实上,这的确是一个贬义词

    根据techopedia.com网站上的词条释义,Code Monkey指的是“技能设定简单而基础、可以被轻易取代的程序员或开发人员,有时候也代指初级程序员。

    在国外,Code monkey常被拿来和那些能够对软件/所开发项目提出建设性意见的“IT专家”做对比,以示揶揄和嘲讽。

    不过,这是一个会“全民自嘲”的时代。

    对于Code Monkey一词,国外的程序员们也会在论坛上进行讨论和吐槽。

    图1:你知道程序猿为什么又叫“代码猴”吗?

    其中点赞数最高的回答是:

    Code Monkey,便是我们这种名面上被称作Soft Programmer,实际却是薪水低的可怜、加班多到爆炸、身体极度疲累、能力被无情低估且始终无法得到(上级或公司)认可的“契约仆人”。

    因此,也有程序员会在感慨怀才不遇时自嘲是“代码猴子”,有点类似咱们说的“IT民工”或“码农”。

    以及,关于程序员的自我修养和转型思考,网上的经验贴足矣,如:

    1.成为某个领域/语言的专家,术业有专攻;

    2.关注经验价值,在公司需要时,扮演根据经验作出回答的良师益友;

    3.不断拥抱新观念、新趋势、新技术;……

    最后,推荐一首《Code Monkey》,送给每一个想要改变世界的程序员:

    ps:演唱者是Jonathan Coulton,一位来自美国的创作型歌手(早期曾是一名程序员),其作品因为颇具极客文化而走红,感兴趣的同学可以关注下。

    src="http://player.youku.com/embed/XMjQyODI0OTA0" frameborder="0"/>
    展开全文
  • 如果你的代码能够做到不解自明,在大多数时候,你根本无需其配备说明文档。 好的代码,就像是一辆配备了优秀音响和杯架的汽车,这辆车在行驶到最高速度的时候,你听不到噪音,也不用担心水会洒出来。在它出现故障...

    好的代码,就像是好的笑话——无需解释就能让别人明白。如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。

    好的代码,就像是一辆配备了优秀音响和杯架的汽车,这辆车在行驶到最高速度的时候,你听不到噪音,也不用担心水会洒出来。在它出现故障的时候,任何一名修理工都可以使用最常见的工具,在最短的时间里轻松将其修好。

    而坏的代码,就像是一辆向你承诺最高速度可以达到200MPH,但是音响只能播放老式的磁带,而且杯架还不稳的车。你在调整反光镜角度的时候,汽车都会突然出现故障,而且一般的修理工还修不了这辆车,必须要找专家,让专家在生产线上使用专业的工具来修理。

    image

    好代码像是一本写作技巧高超的人所写的书

    1.容易理解

    2.分章明确,每一章都有清晰的主旨

    而坏的代码像是刚刚学会写字的人所写的书

    1.各个章节之间纷乱复杂,每一章都没有明确的主旨

    2.连篇累牍的重复一句话,而且毫无缘由

    3.作者在一开始设定了一些规则,但是在后面的内容中却自己不断的违反这些规则

    4.突然间书里出现了一个吸血鬼,而且还能在白天出来吸血。

    要想写出好的代码,你一定要牢记以下内容

    可读性——不只是你,还有你身边与你合作的其他开发者

    可维护性——让你的代码在修改的时候很简单

    简洁性——不要让你的代码看上去毫无必要的复杂

    效率性——尽可能的让你的代码获得最快的运行速度

    明确性——如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。在为方法和属性命名的时候,做到尽可能的合理。把长的代码进行拆分。不要复制/粘贴代码块。

    如果你的同事不能轻松的看懂你写的代码,那么你的代码就不够好。

    代码质量测试

    1.找一个从来没读过你的代码的开发者,让他看你的代码,并且让他试着说出每一个模块的作用。

    2.如果你经常需要向他进行解释,那么说明你的代码不够好。解释的次数越多,代码的质量就越低。

    3.如果你只是静静的坐在一边,他无需问你任何问题,那说明你的代码质量很高。

    当你在写代码的时候,一些信号可以证明你写的代码质量不错:

    • 代码写的很聪明,但是又不会过分的聪明

    • 无论在速度上,还是可读性上,你都使用了最佳的算法

    • 类、变量和函数都得到了正确的命名,让人看一眼就能理解

    • 休息了一个周末之后,你继续写代码,发现自己可以立刻继续之前的工作

    • 那些需要重复使用的东西总是可用

    • 你所使用的方法都很短,最理想的情况下要少于50行,最多不超过100行而且能够完美的执行单个任务

    • 在调用方法的时候,你有着足够的信息,无需在代码堆中苦苦寻找

    • 能够很轻松的在此前的代码中进行功能添加和修改

    • try/catch块的体量尽可能的小

    • 毫不费力的就可以写出单元测试

    好代码都是模块化的

    假设你的项目中有三个不同的层——内层、中层和外层。你的内容不应该从中层和外层那里导入任何东西。中层不应该从外层导入任何东西 ,这样做的好处是,你可以对代码的内层进行独立测试。

    “好的代码本身就是最好的说明文档。” — Steve McConnell

    最后,给大家推荐一个前端学习进阶内推交流群685910553前端资料分享),不管你在地球哪个方位,
    不管你参加工作几年都欢迎你的入驻!(群内会定期免费提供一些群主收藏的免费学习书籍资料以及整理好的面试题和答案文档!)

    如果您对这个文章有任何异议,那么请在文章评论处写上你的评论。

    如果您觉得这个文章有意思,那么请分享并转发,或者也可以关注一下表示您对我们文章的认可与鼓励。

    愿大家都能在编程这条路,越走越远。

    展开全文
  • 如果你的代码能够做到不解自明,在大多数时候,你根本无需其配备说明文档。 好的代码,就像是一辆配备了优秀音响和杯架的汽车,这辆车在行驶到最高速度的时候,你听不到噪音,也不用担心水会洒出来。在它出现故障...

    image
    好的代码,就像是好的笑话——无需解释就能让别人明白。如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。

    好的代码,就像是一辆配备了优秀音响和杯架的汽车,这辆车在行驶到最高速度的时候,你听不到噪音,也不用担心水会洒出来。在它出现故障的时候,任何一名修理工都可以使用最常见的工具,在最短的时间里轻松将其修好。

    而坏的代码,就像是一辆向你承诺最高速度可以达到200MPH,但是音响只能播放老式的磁带,而且杯架还不稳的车。你在调整反光镜角度的时候,汽车都会突然出现故障,而且一般的修理工还修不了这辆车,必须要找专家,让专家在生产线上使用专业的工具来修理。

    好代码像是一本写作技巧高超的人所写的书

    1.容易理解

    2.分章明确,每一章都有清晰的主旨

    而坏的代码像是刚刚学会写字的人所写的书

    1.各个章节之间纷乱复杂,每一章都没有明确的主旨

    2.连篇累牍的重复一句话,而且毫无缘由

    3.作者在一开始设定了一些规则,但是在后面的内容中却自己不断的违反这些规则

    4.突然间书里出现了一个吸血鬼,而且还能在白天出来吸血。

    要想写出好的代码,你一定要牢记以下内容

    可读性——不只是你,还有你身边与你合作的其他开发者

    可维护性——让你的代码在修改的时候很简单

    简洁性——不要让你的代码看上去毫无必要的复杂

    效率性——尽可能的让你的代码获得最快的运行速度

    明确性——如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。在为方法和属性命名的时候,做到尽可能的合理。把长的代码进行拆分。不要复制/粘贴代码块。

    如果你的同事不能轻松的看懂你写的代码,那么你的代码就不够好。

    代码质量测试

    1.找一个从来没读过你的代码的开发者,让他看你的代码,并且让他试着说出每一个模块的作用。

    2.如果你经常需要向他进行解释,那么说明你的代码不够好。解释的次数越多,代码的质量就越低。

    3.如果你只是静静的坐在一边,他无需问你任何问题,那说明你的代码质量很高。

    当你在写代码的时候,一些信号可以证明你写的代码质量不错:

    代码写的很聪明,但是又不会过分的聪明

    无论在速度上,还是可读性上,你都使用了最佳的算法

    类、变量和函数都得到了正确的命名,让人看一眼就能理解

    休息了一个周末之后,你继续写代码,发现自己可以立刻继续之前的工作

    那些需要重复使用的东西总是可用

    你所使用的方法都很短,最理想的情况下要少于50行,最多不超过100行而且能够完美的执行单个任务

    在调用方法的时候,你有着足够的信息,无需在代码堆中苦苦寻找

    能够很轻松的在此前的代码中进行功能添加和修改

    try/catch块的体量尽可能的小

    毫不费力的就可以写出单元测试

    好代码都是模块化的

    假设你的项目中有三个不同的层——内层、中层和外层。你的内容不应该从中层和外层那里导入任何东西。中层不应该从外层导入任何东西 ,这样做的好处是,你可以对代码的内层进行独立测试。

    “好的代码本身就是最好的说明文档。” — Steve McConnell

    文章转载自 开源中国社区[http://www.oschina.net]

    展开全文
  • python为什么叫爬虫作为一门编程语言而言,Python是纯粹的自由软件,以简洁清晰的语法和强制使用空白符进行语句缩进的特点从而深受程序员的喜爱。举一个例子:完成一个任务的话,c语言一共要写1000行代码,java要写...
  • 应用程序域安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。 应用程序域提供了一个更安全、用途更广的处理单元,...
  • 同属于IT高薪行业,为什么在其他看来UI设计师不用写代码只需要画线框就能获得高薪呢?关于这个问题,我觉得首先我们要了解,目前UI设计行业分别有哪些?UI设计按行业一般分为4种行业,分别是移动端UI设计,PC端UI...
  • 代码什么

    2013-07-17 22:54:00
    程序=数据结构+算法 算法,计算步骤,对应的计算机概念指令...我们写的代码是指令序列和存储方式的格式或说是形式化的定义,可以映射计算机世界的指令 转载于:https://www.cnblogs.com/jcode/p/3197030.html...
  • 这个问题在我这就不问题。我看过一本书, C Primer Plus 。作者什么我忘了,总之就是这本书扶我上了编程...为什么?因为我们知道最烂代码是怎样的才能知道最佳代码是怎样的。现在,我想请你:一个字一个字地看...
  • 有一本非常经典的书《Structure and Interpretation of Computer Programs》(《电脑程序的结构和编译》),最初发表于1985年,在序言中就表明其观点: 引用 程序必须能便于我们阅读,让机器执行只是附带的。 ...
  • 大家好,这是我第一张帖子,YY开店有很一段时间了,直到最近才动手开始。什么都不懂,什么都是自己一步步来的,从...就是为什么在旺遍天下生成代码我在线却是离线状态。 之前,也在网上找解决方法,什么浏览器,...
  • 这是一个切换Java版本的代码,关于环境变量的问题不用管,就是判断-h, --help, -c, -v等参数是总是false,下面是代码: ``` #include #include #include using namespace std; int main(int argc, char...
  • 来源:业余码农作者:Amazing1001 引子上一回,我们的主人公小A初次亮相,凭借...为什么业余码农呢,是因为他觉得自己属于半路出家,很多计算机基础思想都不够专业,还有很大的进步空间,因此称自己为业余码农...
  • 为什么称python为胶水语言,语言,终端,胶水,代码,我就为什么称python为胶水语言易采站长站,站长之家为您整理了为什么称python为胶水语言的相关内容。什么是胶水语言?胶水语言(glue language)是用来连接软件组件的...
  • python为什么叫爬虫作为一门编程语言而言,Python是纯粹的自由软件,以简洁清晰的语法和强制使用空白符进行语句缩进的特点从而深受程序员的喜爱。举一个例子:完成一个任务的话,c语言一共要写1000行代码,java要写...
  • 安卓手机系统为什么叫ROM?可以说不仅仅是安卓系统叫做ROM,目前所有的手机系统,都可以叫做ROM(包括但不局限于苹果、塞班、黑莓)这是由于ROM是只读内存(Read-OnlyMemory)的简称。特点是只能读而不能快速改写。 ...
  • 谷歌最早使用 CVS 进行代码管理,1999年改 Perforce。那时是一台 Perforce 主机,加上各种缓存机。 当时,全公司的代码就在一个仓库里面,后来一直沿用这种做法。由于规模不断增长,Perforce 已经无法满足需求,...
  • 类型我还没输呢,它就我输编号,这什么情况?![图片](https://img-ask.csdn.net/upload/201509/23/1443018004_747501.jpg)![图片](https://img-ask.csdn.net/upload/201509/23/1443018046_573796.jpg)![图片]...
  • 但是很奇怪编译执行之后,最后一句printf执行了但是scanf却不执行 为什么 编译器是devc++ // a simple simon game #include #include #include #include #include int main(void) { char another_...
  • 一直纳闷为什么说脚本语言呢,c#可不是脚本语言啊。 -- -- 后来释然,说它是脚本语言是因为传统程序都是由代码构成的(像iOS、Android),但Unity不一样,所有的场景都是由资源构成的,所谓工程师的工作,确实就是写...
  • 作为一门编程言语而言,Python是纯粹的自由软件,...运用python来完结编程使命的话编写的代码量更少,代码简练简略可读性更强,一个团队进行开发的时分读别人的代码会更快,开发功率会更高,使作业变得愈加高效。这...
  • 强麦的交易代码为什么叫WH ?强麦的英文是Wheat Hard,WH是其英文缩写;普麦的交易代码为什么叫PM ?PM是普麦的拼音缩写;棉花的交易代码为什么叫CF ?棉花的英文是cotton,期货的英文是future,所以CF是棉花期货...
  • Python我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象称为“内置电池”。除了内置的库外,Python还有大量的第三方库,也就是别人开发供你使用的定西。当然,如果你开发...
  • 为什么properties和yml中写代码有提示? 随便在配置文件中敲两个字母,都会弹出一个提示框如下,其实这个是系统提供的类中提供的,我们也可以实现自己的属性在这里有提示。 案例:整一个普通类作为系统的配置类,...
  • 为什么我要在2018年学习Python?根据维基百科的解释,"Python是一种广泛使用的高级编程语言,由吉多·范罗苏姆创造,第一版发布于 1991 年。Python 的设计哲学强调了代码的可读性和简洁的语法。" 随着...
  • 为什么我的代码没有报错,可是运行的时候没有办法打出字来 ``` package one; import java.util.Scanner; public class one { public static void main(String[] args) { System.out.print("我王宇昊...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,435
精华内容 1,774
关键字:

代码为什么叫代码