java如何实现同步?
Java 实现同步 有多种方式可以实现,比如同步方法、同步代码块、线程wait和使用特殊域变量等。在开发过程中使用同步方法和同步代码块 用的比较多,比如同步方法用synchronized关键字修饰,java每个对象都有一个内置锁,当用这个关键字修饰方法时,内置锁会保护整个方法,那么在用户调用的方法前,先获得内置锁,不然就会阻塞等。
说到Java同步,就是考虑到线程安全问题,在程序设计上我们可以从两方面入手:
一、在方法上加锁,使用关键字synchronized修饰方法,当并发线程访问该方法时就会发生阻塞,保障方法体时间上只被一个线程所执行;
二、在代码代码块上加锁,同样用关键字synchronized,但是在这里要用大括号包起来。和方法体不同的是,大括号内的代码被线程作为独占资源,并发线程执行时发生阻塞现象。
线程同步是程序开发中不容忽视的大问题,稍有考虑不周会造成非常严重的后果。拿铁道部购票系统为例,某天某个车次票源是固定的,全国各地的人通过互联网去抢这些票源,如何保障售票的准确性就是一个线程同步的例子。
在各行各业的业务操作中还有哪些现象属于这类问题呢?小伙伴们可以思考讨论哦!
Java并发的读写一个变量,读方法要不要加锁?
如果只是读操作,没有写操作,则可以不用加锁,此种情形下,建议变量加上final关键字;
如果有写操作,但是变量的写操作跟当前的值无关联,且与其他的变量也无关联,则可考虑变量加上volatile关键字,同时写操作方法通过synchronized加锁;
如果有写操作,且写操作依赖变量的当前值(如:i++),则getXXX和写操作方法都要通过synchronized加锁。