java synchronized同步静态方法和同步非静态方法的区别与举例

synchronized关键字是java并发编程中为了解决线程对共享资源的竞争造成错误,而提供的解决方案。synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对象变量,你也可以通synchronized来同步类中的静态方法和非静态方法。那么问题来了,同步静态方法与动态方法有什么区别呢?看完下面这个例子或许你就明白了。public class test2 { public static int count = 0;public static synchronized void inc() {count++;}public synchronized void inc2() {count++;} public static void main(String[] args) {//同时启动1000个线程,去进行i++计算,看看实际结果for (int i = 0; i < 10000; i++) {new Thread(new Runnable() {@Overridepublic void run() {test2 t=new test2();<span style="white-space:pre"></span>test2.inc(); //同步静态方法<span style="white-space:pre"></span>t.inc2();//同步动态方法<span style="white-space:pre"></span>}<span style="white-space:pre"></span>} <span style="white-space:pre"></span>Thread.sleep(1000);<span style="white-space:pre"></span>System.out.println("结果: "+count); }}在上面例子中,分别运行test2.inc()与t.inc2(),发现,当同步静态方法时,,结果始终为10000,而当运行同步动态方法时,结果则可能不为10000.究其原因,调用synchronized非static方法加到当前对象上,static方法加到类的Class对象上。由于在Main中的循环每一次动创建一个test2对象,所以运行非静态方法inc2时,加锁的对象只是当前线程中的对象,实际上并没有实现对其它线程中test2对象的限制,因此可能出现多个对象同时写count,而static方法是对class对象加锁,对该对象中的包括static变量的访问都会受到同步的控制。

人生就像爬坡,要一步一步来。

java synchronized同步静态方法和同步非静态方法的区别与举例

相关文章:

你感兴趣的文章:

标签云: