奇奇怪怪

20210201记录

遇到一个加锁的问题 如下例子

public class Juc7 {
    public static void main(String[] args) {
        String strtest="test";
//分别new2个SynStr对象的线程调用方法
        new Thread(()->{
            new SynStr(strtest).test();
        }).start();
        new Thread(()->{
            new SynStr(strtest).test();
        }).start();
    }
}


class SynStr{
    String strtest;
    public SynStr(String strtest) {
        this.strtest = strtest;
    }
    public void test()  {
        synchronized (strtest){    //对String类型加锁 锁定代码块        
      System.out.println(Thread.currentThread().getName()+"休眠前");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }            System.out.println(Thread.currentThread().getName()+"休眠后");
        }
    }
}
代码分析:
这里2个线程 分别new了SynStr对象调用方法
synchronized锁定了字符串
按一般情况来说这2个线程是对不同的字符串加锁 因为new 不是同一个对象
所以输出应该是2个线程同时打印"休眠前" 2s后再同时打印"休眠后"

但实际情况是其中一条线程先打印"休眠前" 2s后"休眠后" 后一条线程继续走

查资料没找到答案 听说是因为string存在常量池中 不同对象中synchronized锁定的字符串也是同一个 
遇到问题随时记录

 

 

 

 

20210318记录

今天回想以前遇到的问题 项目中监听跑线程 new Thread(new xc()).start(); xc的类实现runable 

因为new了所以不会被spring管理到 那时候我是用webcontent.getbean()的手动注入解决这个问题的

现在想到如果我用new Thread(->{})的方式能不能解决注入的问题呢

先来注入失败的demo

//BrandServiceImpl中实现了Runnable
new Thread(new BrandServiceImpl()).start();

//很显然会报错 注入失败导致的空指针异常
Exception in thread "Thread-35" 
java.lang.NullPointerException

用lambda

// controller中加上代码 brandService中有注入dao类
        new Thread(()->{
            log.info("进入线程");
            BrandEntity getentiy = brandService.getentiy();
            log.info("---------------"+JSON.toJSONString(getentiy));
        }).start();
//成功打印了getentiy

既然用lambda能成功 那么new runable肯定也能成功 试下

        new Thread(new Runnable() {
            @Override
            public void run() {
                BrandEntity getentiy = brandService.getentiy();
                log.info("new runable---------------"+JSON.toJSONString(getentiy));
            }
        }).start();
//成功打印
//new runable---------------{"brandId":3,"descript":"小米","firstLetter":"m","

 继续思考

既然spring不管理new对象 那么我把实例化都交给spring去处理好了 对上面空指针异常的例子做修改

//ZThread类是实现了Runnable 再给加上@Component注解
@Autowired
    ZThread zThread;

new Thread(zThread).start();
//成功打印

//注意:单例模式多线程中成员变量是共享的 不想共享应使用ThreadLocal

 

 

 

 

 

20210412记录

今天在测试微服务项目中 删除了一个module 重新再创建一个相同名称的module时 发现目录文件全部都是灰色的

手动配置Sources Resources等目录后 打开主入口文件 出现报错 Cannot resolve symbol 'SpringApplication'

Cannot access org.springframework.context.ConfigurableApplicationContext

按网上解决方案刷新maven解决不了

思考是否是因为原module删除后一些注册文件没删除干净

  测试:先新建一个名为test的module 发现这个module正常

    再删除module后重新创建同名module 还是出现了这个问题

  后查idea的配置文件在哪 在.idea/misc.xml中的

    <option name="ignoredFiles">
      <set>
        <option value="$PROJECT_DIR$/gulimail-search/pom.xml" />
      </set>
    </option>

把上述文件内容指定的module名删除后重启 删除异常module后新建module 恢复正常

 

 

 

 

 

20210518记录

今天在练习io流时发现了一个问题 反复测试找没解决 记录下该问题

    public static void getprofile(){
        try {
            FileInputStream fs = new FileInputStream("C:\\Users\\HB\\Desktop\\test1.properties");
//            BufferedInputStream bs = new BufferedInputStream(fs);
//            int count;
//            byte[] b = new byte[1024];
//            while ((count=bs.read(b))!=-1){
//                System.out.print(new String(b,0,count));
//            }
            Properties ps = new Properties();
            ps.load(fs);
            System.out.println(ps.getProperty("key"));
        }catch (IOException e){
            e.printStackTrace();
        }
    }

上述简化的测试代码 流未关啥的先忽略掉 代码作用就是打印properties配置文件中的某个值

刚开始测试时以上代码注释是打开的 打印key为null 开始排查出现的原因

1.修改了配置文件编码为utf-8无dom 新建配置文件 2.打断点查fs是否为空 发现正常 3.可能手动生成的properties某方面有问题 Property.store()来生成文件

上述方法均失败了 后把上面的代码去注释后成功打印key值

不知道原因 记下这个问题

 

 

 

 

 

posted @ 2021-02-01 21:06  小白小白小白小白  阅读(72)  评论(0编辑  收藏  举报