背景:大家都知道用synchronized来实现加锁,使得不会出现线程安全问题。
但是今天在研究一段经典的面试题时(2个线程++,2个线程--)的问题时,发现在一个类的2个方法上全加上synchronized时,所有的线程竟然变得串行了。
因此,研究了一下,发现原来是对象锁的原因,在方法上加上synchronized时,其实默认是占得了此对象的对象锁,而此对象锁是一个对象只有一把钥匙,因此当调用其中一个带synchronized的方法时,其余的线程都拿不到钥匙而只能等待。
其中的一个反例就是,给此对象再加个方法,前面不带synchronized,就会发现,此方法不受对象锁的控制而随机出现,并非串行。
关键代码如下:
int i=0; int k=0; //带synchronized public synchronized void count(){ for(int j=0;j<10;j++){ i++; System.out.println(Thread.currentThread().getName()+"^_^count,i的值为"+i); } } //不带synchronized public void countForFree(){ for(int j=0;j<10;j++){ k++; System.out.println(Thread.currentThread().getName()+"^_^countForFree^_^,k的值为"+k); } } /** * 1、用4个线程,分别访问2个带锁的方法,发现线程全部顺序执行,因为虽然是2个带锁的方法,但是对象锁的钥匙只有一把。 * 2、用2个线程,一个是访问有锁的方法,一个是访问无锁的方法,可以惊人的发现,线程又开始无序执行,说明无锁的方法不受对象锁的控制。 * @param args */ public static void main(String[] args) { SynchronizedTest synchronizedTest=new SynchronizedTest(); new Thread(new MyThread(synchronizedTest)).start(); /*new Thread(new MyThread(synchronizedTest)).start(); new Thread(new MyThread(synchronizedTest)).start(); new Thread(new MyThread(synchronizedTest)).start();*/ new Thread(new FreeThread(synchronizedTest)).start(); }
完整代码:git@git.oschina.net:iPhone2020/MultiThread.git
synchronized对象锁比喻成房子的钥匙的形象比喻:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
官方参考链接:https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
相关推荐
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
java中synchronized用法
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 需要明确的几个问题: synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句...
测试java中synchronized到底锁住了什么,完整demo
java同步synchronized关键字用法示例
javasynchronized详解.pdf
Javasynchronized机制.pdf
java里面synchronized用法
你还在用synchronized?线程安全相关知识深入剖析
[JAVA][synchronized的使用]
Java synchronized那点事.doc
java synchronized关键字原理、自定义一把锁来实现同步等
java中synchronized的使用,java中的锁锁的到底是什么?是括号里的代码块吗?肯定不是的;
java synchronized详解
基于Java synchronized同步锁实现线程交互.pdf
Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 需要明确的几个问题: synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句...
基础理论知识,描述lock和synchronized的区别和基础的理论,其中还有死锁等基础概念。
主要介绍了Java synchronized关键字使用方式及特性解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
由浅入深解析synchronized锁的机制,各种锁的概念的介绍,膨胀过程,基于redis的分布式锁demo。