线程中的安全问题
安全问题的由来:
当一个程序中有多个线程同时运行的时候, 并且是共享同一数据资源,
那么多个线程会争取抢夺CPU的执行权,当其中的一个线程使用了这个共享数据,但是只是执行了一部分, 还有一部分的
代码没有执行完, 另一个线程就争抢到了CPU的执行权, 同样执行那这一部分,从而导致共享数据的错误。
解决方案:
对多个线程共享数据的语句只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行,即使其他线程有了CPU的执行 权了无法进来执行, 这就需要一个门来限制,叫做同步代码块; synchronized(对象) { 需要被同步的代码 //哪些代码需要同步, 就要看那些代码在操作共享数据,
} 当然门上需要有锁来标识的和控制的,这里的“对象”,就相当于这把门上的锁, 也叫监视器。 这个锁是如何操作的呢? 当然在第一个线程进来的时候, 这个锁当然是开着的, 当这个线程进来之后, 就会把这个门关上,程序中就是同步代码块。 通过同步代码块中的对象来标识, 对象如同锁, 持有锁的线程可以在同步中执行,没有持有锁的线程即使获取了cpu的执行权了,也进不去, 因为没有获取锁, 因此同步就可以解决问题了。
|