1. synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,
lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
volitile没有加锁,volatile的语义, 其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我.(工作内存详见java内存模型)
因此, 当多核或多线程在访问该变量时, 都将直接 操作 主存, 这从本质上, 做到了变量共享.
2. synchronize线程会一直等,lock超过一定时间就不等了,干别的去了。