多线程:synchronized同步方法和同步代码快的区别
2018-03-04 14:25
513 查看
sychronized同步方法和同步代码块的区别,sychronized可以分为四种使用情况:
同步实例方法,
同步实例代码块,
同步静态方法,
同步静态代码块。
上一篇对实例方法和静态方法做了对比得出结论:多个线程可以异步操作同一个类的多个sychronized类型实例方法,但是多个线程却不可以操作一个类的sychronized类型的静态方法。可以理解为实例方法同步的是对象,而静态方法同步的是整个类。
接下来讨论一下同步方法和同步代码块的区别,以实例的为例。
代码如下:public class Var {
synchronized public void methodA(){
try {
System.out.println(Thread.currentThread().getName() + " run method A " + System.currentTimeMillis());
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
public void methodB(){
synchronized (this){
System.out.println(Thread.currentThread().getName() + " run method B " + System.currentTimeMillis());
}
}
public void methodC(){
String syn = "synchtronized";
synchronized (syn){
System.out.println(Thread.currentThread().getName() + " run method C " + System.currentTimeMillis());
}
}
}
public class Test {
public static void main(String[] args) {
Var var = new Var();
new Thread(new Runnable() {
@Override
public void run() {
var.methodA();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
var.methodB();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
var.methodC();
}
}).start();
}
}
执行结果:Thread-0 run method A 1520142974301
Thread-2 run method C 1520142974301
Thread-1 run method B 1520142977302
可以看到方法B比其两个方法打印慢3秒,线程Threa-0首先获得对象var的锁,接着线程Thread-0会休眠3秒,这时虽然线程Thread-1先进入线程规划器,但是因为方法methodB内部使用了sychronized代码块,而且使用了this,这个作用类似于同步方法,所以无法执行。而因为methodC同步的只是方法内部的一个变量所以可以执行。
同步实例方法,
同步实例代码块,
同步静态方法,
同步静态代码块。
上一篇对实例方法和静态方法做了对比得出结论:多个线程可以异步操作同一个类的多个sychronized类型实例方法,但是多个线程却不可以操作一个类的sychronized类型的静态方法。可以理解为实例方法同步的是对象,而静态方法同步的是整个类。
接下来讨论一下同步方法和同步代码块的区别,以实例的为例。
代码如下:public class Var {
synchronized public void methodA(){
try {
System.out.println(Thread.currentThread().getName() + " run method A " + System.currentTimeMillis());
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
public void methodB(){
synchronized (this){
System.out.println(Thread.currentThread().getName() + " run method B " + System.currentTimeMillis());
}
}
public void methodC(){
String syn = "synchtronized";
synchronized (syn){
System.out.println(Thread.currentThread().getName() + " run method C " + System.currentTimeMillis());
}
}
}
public class Test {
public static void main(String[] args) {
Var var = new Var();
new Thread(new Runnable() {
@Override
public void run() {
var.methodA();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
var.methodB();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
var.methodC();
}
}).start();
}
}
执行结果:Thread-0 run method A 1520142974301
Thread-2 run method C 1520142974301
Thread-1 run method B 1520142977302
可以看到方法B比其两个方法打印慢3秒,线程Threa-0首先获得对象var的锁,接着线程Thread-0会休眠3秒,这时虽然线程Thread-1先进入线程规划器,但是因为方法methodB内部使用了sychronized代码块,而且使用了this,这个作用类似于同步方法,所以无法执行。而因为methodC同步的只是方法内部的一个变量所以可以执行。
相关文章推荐
- Java多线程3.1:synchronized同步方法
- java中的synchronized(同步代码块和同步方法的区别)
- 新手向-同步关键字synchronized对this、class、object、方法的区别
- 多线程---java同步方法和同步代码块的区别
- java synchronized同步静态方法和同步非静态方法的区别与举例
- 2.3静态synchronized同步方法和synchronized(class)代码块
- iOS学习笔记74-IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别附代码
- 从头认识多线程-2.19 synchronized同步方法的无限等待与解决方法
- java多线程的同步方法实例代码
- synchronized方法与synchronized代码快的区别
- JavaSE8基础 多线程synchronized 同步的成员方法用的锁对象是this
- java synchronized同步静态方法和同步非静态方法的区别与举例
- Java中的synchronized同步代码块和同步方法的区别
- 同步synchronized方法和代码块
- 从头认识多线程-2.16 同步静态方法和静态代码块
- 【JAVA】多线程之synchronized 同步数据 方法
- 多线程-同步代码快的锁及同步方法应用和锁的问题
- java中的synchronized同步代码块和同步方法的区别
- java多线程之-----对象及变量的并发访问1(synchronized同步方法)
- java多线程下synchronized修饰static方法与非static方法的区别