小石头1993

小石头1993 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

小石头1993 收藏了问题 · 2018-02-04

Java:这种业务逻辑如何做到线程安全呢?

public class Process implements Runnable {
    public static Set<String> set = new HashSet<String>();

    public void run() {
        // 1、遍历取出set中元素
        // 2、具体业务逻辑
        // 3、清空set
        set.clear();
    }

    public void storage(String str) {
        set.add(str);
    }
}

其他模块会调用storage()向Set中添加元素,而Process会定时取出并处理Set中的元素,如何保证在Process的run()执行的同时,其他模块不会向Set中添加元素呢?如果在步骤2、3之间刚有其他模块向Set中添加元素,这个元素还没有得到处理就被消除掉了,希望得到大家的指点。

小石头1993 关注了问题 · 2018-02-04

解决Java:这种业务逻辑如何做到线程安全呢?

public class Process implements Runnable {
    public static Set<String> set = new HashSet<String>();

    public void run() {
        // 1、遍历取出set中元素
        // 2、具体业务逻辑
        // 3、清空set
        set.clear();
    }

    public void storage(String str) {
        set.add(str);
    }
}

其他模块会调用storage()向Set中添加元素,而Process会定时取出并处理Set中的元素,如何保证在Process的run()执行的同时,其他模块不会向Set中添加元素呢?如果在步骤2、3之间刚有其他模块向Set中添加元素,这个元素还没有得到处理就被消除掉了,希望得到大家的指点。

关注 6 回答 1

小石头1993 关注了问题 · 2018-02-04

解决java的日志到底是怎么一回事

关于java的日志的种类繁多表示一个新人实在被绕晕了

请问以下的东西是什么、有什么作用、有什么关系?

  1. commons-logging

  2. log4j

  3. logback

  4. slf4j

  5. ....

主要引起我绕晕的是这个篇文章


http://blog.csdn.net/wangjunjun2008/article/details/18732019

http://www.oschina.net/translate/why-use-sl4j-over-log4j-for-logging

关注 6 回答 3

小石头1993 收藏了问题 · 2018-02-04

java的日志到底是怎么一回事

关于java的日志的种类繁多表示一个新人实在被绕晕了

请问以下的东西是什么、有什么作用、有什么关系?

  1. commons-logging

  2. log4j

  3. logback

  4. slf4j

  5. ....

主要引起我绕晕的是这个篇文章


http://blog.csdn.net/wangjunjun2008/article/details/18732019

http://www.oschina.net/translate/why-use-sl4j-over-log4j-for-logging

小石头1993 赞了回答 · 2018-02-04

解决java的日志到底是怎么一回事

首先,你需要了解一个设计模式:适配器模式。

Java用来记录日志的库有很多,例如有JDK自带的Logger、Log4j、Logback,它们之间互相不兼容,通常情况下,我们写代码的时候选用其中一个就可以了。

但是,如果有一天你写的代码开源了,要给别人使用,那么问题就来了,该使用哪个日志库?当然不能随便选用一个了,因为你不知道使用你的开源库的人用的哪个日志框架。这时候你想无论别人使用哪个日志框架,你都可以兼容,这时候就要使用commons-logging或slf4j了。所以一般开源框架都不会使用具体的日志框架,而是用commons-logging或slf4j处理日志,这样可以根据使用者使用的具体日志框架来记录日志,例如Hibernate用的是slf4j(不过好像最新版本用的是JBOSS的适配器了)、Spring用的是commons-logging。

Java在日志这块不像JDBC,JDBC有一套共同的标准API,无论你连接Oracle、MySQL,API接口都是一样的。但是日志库JDK Logger、Log4j、Logback是互相不兼容的,没有共同的Interface,所以commons-logging、slf4j通过适配器模式,抽象出来一个共同的接口,然后根据使用的具体日志框架来实现日志。

总结一下,就是JDK Logger、Log4j、Logback是具体的日志框架的实现,commons-logging、slf4j是解决日志框架之间不兼容而抽象出来的适配器接口。

最后,这篇博客是我对slf4j的源码解析,希望对你有帮助:http://blog.csdn.net/xiao__gui/article/details/32695647

关注 6 回答 3

小石头1993 关注了用户 · 2018-02-04

叉叉哥 @wucao

江湖人称“叉叉哥”,90后程序员,Java脑残粉,个人公众号“Java论道”。

关注 46

小石头1993 关注了问题 · 2018-02-04

解决java的服务是每收到一个请求就新开一个线程来处理吗?tomcat呢?

据说服务有两种:

  1. 收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞
  2. 收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞。

那么,问题来啦:

  1. java的服务是属于那种形式呢,怎么区分?
  2. 比如tomcat又是属于哪种呢?

请高人详细解说下,多谢!

关注 13 回答 2

小石头1993 关注了用户 · 2017-12-26

Arno @inuo

一位热爱前端的 PHP 攻城狮

关注 49

小石头1993 关注了问题 · 2017-02-18

spring的@Bean是怎么实现的?

@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {

    @Bean
    AuthorizeInterceptor authorizelInterceptor() {
        return new AuthorizeInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorizelInterceptor())
                .addPathPatterns("/user/**");
        super.addInterceptors(registry);
    }
}

我是这么理解这段代码的:@Bean注解的方法里new出来的对象会仍到IOC里,下面调用了上面注解的方法会在IOC里拿出这个Bean。如果这个理解没错的话比较好奇下面的方法调用怎么会变成到IOC里取Bean,试了一下JDK的动态代理中下面这个方法addInterceptors()调用authorizelInterceptor()方法,在执行authorizelInterceptor()这个方法的时候是原模原样执行的不会再走一次代理。当然Jdk不行,Cglib是可以实现这个的。
那么@Bean它是怎么实现的,这里动态代理到底可不可行?

关注 3 回答 1

小石头1993 关注了问题 · 2017-02-18

关于分层和循环注入的问题,求大神帮忙解答一下

通常我们在做一套系统时,一个请求的流程大概是action(controller)->service->dao,这个流程很清晰,也很简单,但是在具体业务中我们可能需要不同的业务之间的配合使用,这时可能需要service中调用service。
例如AService中调用BService,BService中又调用CService,CService又调用AService,这样我们就造成了A中注入B,B中注入C,C中又注入A的循环注入情况,这时Spring在初始化时就出问题了。

在查询了一些资料中,基本上意见都是“这属于系统设计问题”,经过不断的思考,我想出一个解决办法,那就是我们在普通的三层设计中再添加一层(BusinessService),我们规定:

1,**Service层只面向单表(这里的单表指的是不注入其他service层,当然在写sql时仍然可以join其他表,不过返回结果就需要自定义一个dto来接收)**。
2,**若在service层只对数据库负责,要进行数据持久时,不校验数据的正确性,只校验数据是否为空,是否符合数据库的非空约束、是否符合数据库的索引约束等。**

若有比较复杂的业务(需要多个子业务支撑)时,我们在Business层中统一调用多个service层的方法,然后依次由BusinessService层进行组装和事务控制,举个例子:

我们现在有一个添加学生个业务,添加学生总共有3个子业务
   1,保存学生基本信息
   2,更新学生所在的班级学生数量
   3,更新学生所在的学校的学生总数

那我们只需要在StudentBusinessService中依次注入StudentService、ClassStudentCountService、SchoolStudentCountService,并在StudentBusinessService中的add方法内依次调用这三个子业务的对应方法即可。
如此,这样A->B-C->A 就变成了 A-B,A-C(A层为BusinessService层,B、C为service层,service层永远不会调用BusinessService层,从而打破了之前循环结构) 从而解决了之前的问题了

但是,随着业务的增长,之前在BusinessService中定义的方法可能成为更大的一个业务中的一个子业务了,
举个例子,

教师在从一个校区调到另一个校区,此时需要将该教师原有的学生全部加入到现在的校区中(**此处为业务规定,不做合理性解释**)

那么也很简单,我们需要在TeacherBusinessService中注入StudentBusinessService即可,然后调用StudentBusinessService的add方法,然后add方法会调用其他子业务,但是这样可能又回到了之前的A->B-C-A的模式了,随着业务的增长,很可能又会出现循环注入的问题。

我暂时还没想出更好的解决办法,不知各位是如何处理类似的问题的?

关注 7 回答 4

认证与成就

  • 获得 0 次点赞
  • 获得 3 枚徽章 获得 0 枚金徽章, 获得 1 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-11-29
个人主页被 84 人浏览