`

线程、 同步

 
阅读更多
线程基础
1 线程的run()方法中可以调用其他方法、构造其他对象,甚至可以生成其他线程。
但是线程要在这里启动,并在这里结束。当run()方法完成时,线程也就消失了。
事实上,run()对于线程,就像main()对于非线程化的传统程序一样。
单线程程序会在main方法返回时退出,
多线程程序则需要main方法和所有非守护线程都返回时才退出。

2 如何返回线程的信息?
1)轮询 - 低效
2)回调 - 节省CPU资源,更重要的是回调更灵活,可以处理涉及更多线程、对象的复杂情况:e.g. 多个对象关心某一线程的计算结果,采用监听者模式。

3 方法被哪个线程调用就是被哪个线程执行,而不是看它定义在哪个类中。

4 要避免在构造函数中启动线程,特别是当线程将回调初始对象的时候
这里有一个竞争条件,可能会让新线程在构造函数结束和对象完全初始化之前进行回调。
  
同步
1 Java只能防止对同一对象同步的其他线程使用共享资源,并没有提供阻止其他所有线程使用共享资源的方法。

2 同步的替代方式
1)使用局部变量代替字段,每次进入一个方法时,虚拟机将为该方法创建全新的局部变量集合。
一个局部变量不会用于两个不同的线程,每个线程有其自己的局部变量集。
2)利用不可变性:所有字段声明为私有,不要编写任何可以改变他们的方法
3)只将非线程安全的类用作线程安全的类的私有字段

3 死锁
防止死锁最重要的技术是避免不必要的同步。
同步应该是保证线程安全的最后一种手段。

4 同步 vs 异步 VS. 阻塞 vs 非阻塞
同步、异步用于描述宏观层面的数据收发特征,
阻塞、非阻塞是底层数据读写特征,read(buf, length),
阻塞的read如果没有读到指定length的数据就会愣等在原地,即为阻塞;
非阻塞的read则会立即返回,返回值为当前读到的数据长度。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics