1. 并发访问带来的线程安全问题:
1) 设想当多个线程刚好在同时时间访问一个公共资源时会怎么样?
2) 如果仅仅是读取那个资源那没什么问题,但如果要修改呢?同时修改必然会发生冲突导致数据不一致的错误(最典型的就是同时写一个文件);
3) 在实际问题中最典型的就是银行取钱问题,如果多人刚好同时用同一个账号取钱就会发生错误,而这种错误往往是非常严重的错误;
4) 因此要提供一种同步机制,即多线程访问临界资源时(对临界数据进行修改时)必须要同步进行;
5) Java提供了三种方法来实施线程同步,根据具体情况和需求选择一种进行同步:同步监视器(同步代码块)、同步方法、同步锁;
6) 但所有同步机制的原理都是这三步:加锁(锁定临界资源) -> 修改(修改临界资源) -> 释放锁(释放对临街资源的占用权);
2. 同步监视器——同步代码块:
1) 即对并发访问的临界资源用关键字synchronized进行限定,将其设定为同步监视器,而其后花括号中包含的代码就是同步代码块:
synchronized (Object obj) {
... // 同步代码块
}
2) 这个语法的意思就是进入代码块之前先将资源obj锁定住,只有锁定住资源obj的线程才有资格执行后面的代码块,代码块执行完毕之后线程就释放了对资源obj的锁定,然后obj就可以被其它线程锁定并使用&#