java同步机制,解决线程安全问题
同步代码块
synchronized(同步监视器){
//需要被同步的代码
}
1、需要同步的代码一般为操作共享数据的代码
2、共享数据:多个线程共同操作的变量
3、同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。
要求:多个线程必须共用同一把锁
在实现runnable接口创建多线程的方式中,可以考虑使用this来充当同步监视器。也可以考虑使用当前类.class来充当
在继承thread类创建多线程的方式中,可以使用this充当同步监视器(但是要考虑this是否唯一,如果该线程类被调用时每次都需要new一个对象就不要使用this),尽量考虑使用当前类.class充当同步监视器(该方式使用了反射的原理,因为不管new多少次对象类只有一个)
例:
synchronized(ThreadTest.class){
//需要被同步的代码
}
4、使用同步的好处:解决了线程的安全问题
坏处:操作同步代码时,只能有一个线程参与,其他线程等待,相当于一个单线程的过程,效率低。
同步方法
如果一个方法中全部都是共享数据的代码,那么该方法可以声明成同步的
1、同步方法仍然有同步监视器,只是不像之前一样显式的声明
2、非静态的同步方法,同步监视器是:this
静态的同步方法,同步监视器是:当前类本身