一、多线程的协同和同步控制方面
在我对多线程协同的认识中,线程有可能只对工作内存中的副本进行赋值,只到最后一次赋值后才同步到主存储区,总的来说,在足够长时间的运行后,各个线程对共享资源的调度顺序都是超乎想象的。而保证线程按序进行的重要手段就是synchronized,java用synchronized关键字做为多线程并发环境的执行有序性的保证手段之一。当一段代码会修改共享变量,这一段代码成为互斥区或临界区,为了保证共享变量的正确性,synchronized就标示了临界区。也可以理解为同一时间,只能有一个线程来访问、调用synchronized修饰的方法或代码块。同时也可以在线程所在代码中设定计数器来确定每过固定时间来修改共享资源。抑或是设立共同clock类来同步多个线程的时间。
二、度量分析
经过第一阶段的代码分析以及昂神给大家分享的代码规范之后,感觉自己的代码风格还是有改善的,避免了过长的类和重复冗余的代码块,尽量利用方法将各个类、变量整合。
三、BUG分析
这三次作业我的bug集中在同质处理、复杂请求的处理上,前者是因为太懒,coding前期往往不需要考虑同质,而到了星期三的时候又懒得加同质判断......而后者是因为在线程同步中,每轮运算会产生一些误差,在被大佬的巨多的数据输入后会出现运行误差。
而对于测试其他同学的bug,目前还没有发现一些特别有价值的bug,主要还是集中在一些输出情况下格式错误、未考虑同质等等常规输出。
四、心得体会
通过这三次的面向对象作业,我们基本上对线程安全有了一定的认识。我感觉自己对线程的理解还需要提升,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,这些知识我们在操作系统还有计算机组成原理中都有所了解,但是将其具体到java代码中还是有一定难度的。线程计算和我们常规的计算思维是不同的,其运行顺序的不确定性和计算时间的不定长往往会造成不可复现的bug。总而言之,面向对象编程中还有许许多多和常规思维不同的地方,只有coding才能让问题真正暴露出来。
关于bug调试方面这几次也受益颇多,这三次作业的在coding时的bug主要集中在线程不同步、资源不共享、线程相互阻塞等等问题,这些bug个人认为用print来debug是最佳的,eclipse等IDE调试时无法具体体现时间线上各个变量的变化,而print则可以完全避免。