第一种情况:多个线程对同一份数据操作。
同步方法:
a) 将对数据的操作加上synchronize
b) 用ReentrantLock,使用ReentrantLock的好处:1、可以用tryLock(time),指定获取锁的时间上限,如果指点时间内都没有获得锁,则可以释放当前线程获得的互斥资源,避免死锁。2、可以在构造ReentrantLock时设置为公平锁,即优先将锁给等待时间最长的线程。不设置时,默认为不公平锁。synchronize也是不公平锁。
c)用AtomicInteger等原子类,使用compareAndSet方法实现数据的同步
d)使用乐观锁,将数据放在数据库中,并加一个version版本。每次对数据更新时,同时判断version是否和读取数据时的相同。update table set data=data1,version=verison+1 where id=xx and version=yy。如果version不同,说明在当前线程读出数据之后,有另外的线程将数据改变了,此时再做其他处理。
第二种情况:多个数据库间维护同一数据的同步
如MySQL的Master和slaver之间的数据实时同步,是通过binary log实现。master将对数据的更新操作都写到binary log,slaver再将binary log复制到自己的relay log中进行重放,从而实现同步。
具体请参见:大型分布式网站架构设计与实践 4.3.3高并发系统设计 5.4.2实时数据同步