synchronized同步方法
在java开发中synchronized可以在方法上声明,如果方法上有synchronized关键字就说明该方法是同步方法,在调用该方法的时候回自动加锁,使得其他需要调用该方法的线程等待。简单的说synchronized方法时按照顺序执行的
在这里先说一下变量的安全问题,据我了解方法的局部变量为线程安全的,因为每次调用该方法时都会生成一个变量,所以不存在不同线程使用同一个变量的问题,如果是实例变量,即在类内定义的全局变量,则有可能会出现线程的安全问题,因为多个线程调用的是同一个变量。所以可能会出现数据交叉的情况。
如果想解决非线程安全的问题只需要在方法前面加上synchronized关键字即可
synchronized public void add(String name){}
该关键字加上后当此方法被调用是就会自动加锁,等到调用此方法的线程调用完毕其他的线程才可以调用该方法,这样就可以避免出现非线程安全的问题。
synchronized方法的特点
synchronized是对象锁,而不是针对方法的锁
如果你实例化两个相同对象,则在进行调用这两个相同对象的相同方法时,锁是不起作用的。
synchronized是可以锁重入的
当一个线程得到对象锁后,再次请求该对象锁时是可以直接得到的,这也就是说在一个synchronized方法内调用该类的其他synchronized方法时,是永远可以得到锁的,无需等待。
synchronized不具备继承性
当子类重写父类的synchronized方法时,如果子类不添加synchronized关键字,则该方法不具备同步性
当出现异常时,锁会自动释放
synchronized(x)代码块
首先我想说一下括号内参数X,当参数为this时表示该锁为对象锁和synchronized方法是一样的,当参数为*.class时表示该锁为类锁,即实例化的该类的所有对象共用同一个锁,当参数为其他时,表示参数相同的对象共用一个锁,特别注意,当参数用String类型创建时,注意缓存问题
String a = "a"; // 这两个常量如果用 == 来比较的话 返回值为true,因为java中如果值是一样的,多个变量的值会指向同一内存块
String b = "a";
synchronized( )来对代码块进行声明时,未被包裹的代码块是无需等待的,可以异步执行。