应用情况:多线程同时访问,并且代码块不能被同时执行的时候使用
使用synchronized用来修饰方法
基本执行过程:当多个线程同时访问被synchronized修饰的方法的时候,有且只有一个线程可以访问,当一个线程在访问的时候,其他线程只能等待。当一个线程访问完毕后下一个线程才可以访问。
原理解析:当方法被synchronized修饰后,如果想要执行该方法就必须获得相应的锁。
锁的说明:每个类又且仅有一个锁(针对静态方法),每个类的示例也是有且仅有一个锁。
当多个线程在同时访问同一个方法的时候,执行该方法就必须获得相应的锁,同时锁只有一个,所以只能有一个线程可以获得锁,所以只有一个线程可以执行,当方法执行完毕,线程会释放锁,其他线程获取该锁,执行方法。
进阶说明:由于每个类只有一个锁,所以当一个类中又多个方法被synchronized修饰的时候,在同一时间内只有一个方法可以获得锁,所以只有一个方法可以执行。
原理说明进行测试验证:(生物实验有个唯一变量原则,本次也采用这个原则)
验证多线程同时访问被synchronized修饰的方法,方法顺序执行结果:
1.当多线程调用方法的时候,方法没有被synchronized修饰的时候的执行结果
线程启动 调用方法 打印结果根据打印结果可以看出两个线程调用的方法的时候,方法会被同时执行。
当我们仅仅为shwoDO()添加一个修饰关键字synchronized的时候,方法就会被顺序调用。结果如下:
更改后的方法 打印结果
使用synchronized用来修饰代码块
基本说明:当synchronized在修饰代码块的时候需要一个自定义锁,当在多线程访问,代码块的时候,只要获得自定义锁就可以执行。
自定义锁:可以是一个类,也可以是一个实例(可以是Objcet的子类,也可以是当前类自己(this)),当具有相同自定锁的时候,代码块会顺去执行,当锁不同的时候互相不影响。
每个类又且仅有一个锁(针对静态方法),每个类的示例也是有且仅有一个锁。
基本书写格式:synchronized(自定义锁){同步执行代码块}
测试将showDO()方法个能改为如图,代码块内部内容同样会同步执行。
更改后方法 打印结果总结说明:synchronized具有有两种使用方法,第一种是修饰方法,第二种修饰代码块。
无论那中方法,被修饰的内容都会同步执行。这也是synchronized的作用。
关于两种方法的使用:对于修饰方法常常会发生不必要的代码块被同步,同时锁不可以选择,但是使用 简单。对于修饰代码块方法用起来更精确,需要自己制定锁,用起来稍微麻烦一点。
若有错误之初,请给予指示,谢谢~~~~~
网友评论