java中Synchronized关键字之对象锁
当有多个线程对一个共享数据进行操作时,需要注意多线程的安全问题。
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。而用的最多的就是synchronized关键字。
语法:Synchronized(对象锁){}
被synchronized关键字修饰的一个方法,则这个方法叫做同步方法
静态synchronized方法的锁是对应的字节码对象(Class对象),而非静态synchronized方法的锁是个实例对象
当synchronized方法执行完或发生异常时,会自动释放锁。
1.是否使用synchronized关键字的不同
package threadDemo; public class ThreadDemo { public static void main(String[] args) { Example example = new Example(); Thread t1 = new TH(example); Thread t2 = new TH(example); t1.start(); t2.start(); } } class Example { public synchronized void show() { for (int i = 0; i < 10; ++i) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); } } } class TH extends Thread { private Example example; public TH(Example example) { this.example = example; } @Override public void run() { example.show(); } }
运行结果:
show()0 show()1 show()2 show()3 show()4 show()5 show()6 show()7 show()8 show()9 show2()0 show2()1 show2()2 show2()3 show2()4 show2()5 show2()6 show2()7 show2()8 show2()9
是否在show()方法前加上synchronized关键字,这个例子程序的执行结果会有很大的不同。
如果不加synchronized关键字,则两个线程同时执行show()方法,输出是两组并发的。
如果加上synchronized关键字,则会先输出一组0到9,然后再输出下一组,说明两个线程是顺次执行的。