锁代码块和锁方法的标准的说法应该是同步代码块和同步方法。区别是:1.写法;2. 锁的范围;3. 锁的类型。其中,同步代码块是写在方法中的;同步方法是通过关键字标识方法。

一、锁代码块和锁方法的区别
锁代码块和锁方法的标准的说法应该是同步代码块和同步方法。区别是:
1.写法
同步代码块是写在方法中的
同步方法是通过关键字标识方法
// 同步代码块
public void test2() {
synchronized (锁) {
// 代码
}
}
// 同步方法
public synchronized void test1() {
// 代码
}
2. 锁的范围
同步代码块的范围是它大括号所包含的所有代码
同步方法的范围是方法中的所有代码
3. 锁的类型
同步代码块使用的锁是可以自定义的,可以是任意的对应或者类(类本质也是传入的一个对象)
同步方法使用的锁是固定的,或者说是规定好的。
public class Test {
public static void main(String[] args){
Test t = new Test();
t.test3();
}
// 使用当前类对象作为锁,在本例中就是使用 Test.class 作为锁
public static synchronized void test1() {
}
// 等同于
public void test2() {
synchronized (Test.class) {
}
}
// 使用 this 作为锁,在本例中就是使用对象 t 作为锁
public synchronized void test3() {
}
// 等同于
public void test4() {
synchronized (this) {
}
}
}
延伸阅读:
二、Synchronized(this)锁代码块
用关键字synchronized修饰方法在有些情况下是有弊端的,若是执行该方法所需的时间比较长,线程1执行该方法的时候,线程2就必须等待。这种情况下就可以使用synchronized同步该方法中会引起线程安全的那部分代码,其余不会引起线程安全的就不需要同步,这部分代码就可以多线程并发执行,减少时间提高效率。
举例:多线程执行同一个方法时,同步方法和同步代码块花费时间的比较
synchronized修饰方法(同步方法)
synchronized修饰longTimeTask方法,其中花费时间比较长的且与线程安全无关的是37-39行代码,会引起线程安全问题的是42-46。
以上就是关于锁代码块和锁方法有啥区别的内容希望对大家有帮助。
