在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别。概念上的区别是
1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执行顺序是一个乱序,没有固定的执行顺序。
2:同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务。
由于同步锁和互斥锁在使用中没有任何区别,仅仅是因为线程的关系导致了概念上的一点点区别,所以不必深究其异同。很多教程中并没有对这两者作区分。

下面通过一个实例来掌握同步锁的原理和使用方法。先来执行一下如下没有加锁的代码:
public class LockDemo { private int i = 0; public void increaseI() { // synchronized (this) { for(int k=1;k<=10;k++) { // 对i执行10次增1操作 i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--; i++; } System.out.println(Thread.currentThread().getName() + "线程,i现在的值:" + i); //} } public static void main(String[] args) throws InterruptedException { LockDemo ld = new LockDemo(); int threadNum = 1000; MyThread[] threads = new MyThread[threadNum]; for(int i=0;i
代码预期的结果为10000。实际输出结果不到10000。

没有加互斥锁
这是因为1000个线程共享了对象ld的属性i,在访问修改i的值时,可能会出现不同步的情况。
线程的同步(互斥)正是为了防止多个线程访问一个数据对象时,对数据造成的破坏:去掉第4行和第10行的注释,给increaseI()方法加锁后,各个线程对变量i的访问就是互斥的了,就不会对数据造成无法预估的结果:输出结果为预期的10000。
