Synchronized修饰静态变量和普通变量的区别
2018-01-05 13:45
148 查看
这里主要涉及到类对象(static方法),对象方法(非static方法)
我们知道,当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例);
当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象)
所以,当synchronized修饰一个static方法时,创建线程不管是new JoinThread()还是new Thread(new JoinThread()),在run方法中执行inc()方法都是同步的;
相反,当synchronized修饰一个非static方法时,如果用new JoinThread()还是new Thread(new JoinThread())方式创建线程,就无法保证同步操作,因为这时
inc()是属于对象方法,每个线程都执有一个独立的对象实例new JoinThread(),所以多线程下执行inc()方法并不会产生互斥,也不会有同步操作。
另外如果考虑到变更的原子操作,可使用atomic包下面的包装对象,这些对象都是对volatile修饰变量的一种延伸,可保证变量的原子操作而不用去同步方法或
代码块是否同步。
我们知道,当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例);
当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象)
所以,当synchronized修饰一个static方法时,创建线程不管是new JoinThread()还是new Thread(new JoinThread()),在run方法中执行inc()方法都是同步的;
相反,当synchronized修饰一个非static方法时,如果用new JoinThread()还是new Thread(new JoinThread())方式创建线程,就无法保证同步操作,因为这时
inc()是属于对象方法,每个线程都执有一个独立的对象实例new JoinThread(),所以多线程下执行inc()方法并不会产生互斥,也不会有同步操作。
另外如果考虑到变更的原子操作,可使用atomic包下面的包装对象,这些对象都是对volatile修饰变量的一种延伸,可保证变量的原子操作而不用去同步方法或
代码块是否同步。
相关文章推荐
- C++类中静态变量和普通变量的区别
- php中static 静态变量和普通变量的区别
- php中静态变量和普通变量的区别
- php中static 静态变量和普通变量的区别
- 堆栈,静态变量和普通变量,静态函数和普通函数的区别
- (转)堆栈,静态变量和普通变量,静态函数和普通函数的区别 .
- C语言中的静态变量和普通变量的区别
- static修饰的变量和函数与普通变量函数的区别
- 堆栈,静态变量和普通变量,静态函数和普通函数的区别
- Java学习疑点(2)--被static修饰的静态变量与实例变量之间生命周期的区别
- 堆栈,静态变量和普通变量,静态函数和普通函数的区别
- php中static 静态变量和普通变量的区别
- synchronized修饰静态方法和普通方法有什么区别
- 静态函数里定义的变量,不为所有对象共享,类的静态变量和类外全局变量区别,静态函数和普通函数区别
- 静态变量与普通变量的区别
- C# 静态变量与普通变量的区别
- 静态变量与实例变量的区别
- static和fianl修饰变量的区别
- Java基础——成员变量、局部变量和静态变量的区别
- java中普通变量、静态变量、静态代码块初始化的顺序 收录总结