奇奇怪怪
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值
不知道原因 记下这个问题