问题:前面学习的线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,不需要外部资源或方法,也不必关心其他线程的状态或行为。但是经常有一些同时运行的线程需要共享数据,此时就需要考虑其他线程的状态或行为,否则就不能保证程序运行结果的正确性。
解决方案:
线程同步:当两个或多个线程需要访问<同一资源>时,需要已某种顺序确保该资源某一时刻只能被一个线程使用的方式。
采用同步来控制线程的执行有两种方式:同步方法和同步代码块。这两种方法都使用synchronized关键字实现。
①同步方法:通过在方法声明中加入synchronized关键字来声明同步方法。使用synchronized修饰的方法控制对类成员变量的访问。每个类实力对应一把锁,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对应每一个实例,其所有shengmingweisynchronized的方法只能有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。
同步方法的缺陷:
如果将一个运行时间比较长的方法声明成synchronized将会影响效率。
②同步代码块:
语法:
synchronized (syncObject){
//需要同步访问控制的代码
}
synchronized块中的代码必须获得对象syncObject的锁才能执行,具体机制与同步方法一致。由于可以针对任意代码块,且可以任意指定上锁的对象,故灵活性较高。
java的线程同步
最新推荐文章于 2021-02-13 05:04:21 发布