线程同步与锁
当多个线程同时操作一个数据源的时候,需要留意数据源操作被重复同时执行。这个时候就需要考虑线程同步与锁的问题。
线程同步与锁
- 使用关键字syncronized 来同步
- syncronized修饰实例方法
- syncronized修饰实例方法
直接在方法返回类型与修饰符之间加上syncronized
- 使用关键字syncronized 来同步
- syncronized修饰类方法(静态方法)
直接在方法返回类型与static之间加上syncronized - syncronized修饰代码块
在代码块前加上syncronized(Object lock), 这里的lock是Object的一个对象
- 使用Object来上锁
- syncronized修饰代码块需要加(Object lock)来上锁
wait与notify,还有死锁的问题
- 火车票问题
火车票问题里面,只需要同步就可以了,不需要加wait与notify, 加了反而再复杂。
- 火车票问题
- 生产者与消费者模型
一定需要加wait与notify
syncronized 的核心在于,操作同一个对象。
- 当使用Thread创建线程的方式的时候,我们需要创建多个对象。但是多个对象表示,会有多个独立的方法。这样来说使用syncronized是没有什么意义的。所以此时syncronized修饰实例方法就必须改为修饰类方法,需要加static修饰
>或者直接用syncronized修饰代码块,但是这样的话需要加一个Object lock。
- 当使用Runnable来创建线程的方式的时候,因为我们可以传同一个对象进去,操作的是同一个对象,所以不用担心操作同一个对象的问题,
这样来说,无论使用哪一种方式来同步操作,都没什么问题。
除开以上,还需要考虑使用syncronized时候的逻辑问题。