一.运用synchronized关键字

首先我们来看看一个多线程中线程不安全的列子

代码如下:

共享数据类:

public class NotSynchronizated extends Thread {
private int num =10;
@Override
public void run(){
try {
System.out.println("当前线程为:"+currentThread().getName());
num--;
System.out.println("num的值为:"+num);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

线程测试类:

public class Text {

    public static void main(String[] args) {
//将共享数据放入3个线程里进行处理
NotSynchronizated notSynchronizated = new NotSynchronizated();
Thread t1=new Thread(notSynchronizated,"A");
Thread t2=new Thread(notSynchronizated,"B");
Thread t3=new Thread(notSynchronizated,"C");
Thread t4=new Thread(notSynchronizated,"D");
t1.start();
t2.start();
t3.start();
t4.start();
}
}

在这个列子中run方法没有使用关键字synchronized,那么就会造成线程不安全,结果如下:

 

那么当我们使用关键字synchronized后结果就会同步了,结果如下:

那么,在这里是对这个run方法进行了同步呢?还是对这个对象进行了同步呢?

二.synchronized同步的是对象

为了证明synchronized同步的是对象,我们举出下面的代码:

共享资源类:

public class SynchronizatedObject extends Thread {
private int num=20;
@Override
public synchronized void run(){ System.out.println("当前的线程为"+currentThread().getName());
num--;
System.out.println("当前num为"+num);
} }

测试类:

public class Text {

    public static void main(String[] args) {
SynchronizatedObject synchronizatedObject1=new SynchronizatedObject();//创建第一个资源共享类
SynchronizatedObject synchronizatedObject2=new SynchronizatedObject();//创建第二个资源共享类
Thread t1=new Thread(synchronizatedObject1,"A");//加入
Thread t2=new Thread(synchronizatedObject2,"B");//加入
t1.start();
t2.start();
}
}

结果如下:

从这里明显看出这个synchronized关键字同步的是对象而不是方法,

如果同步的是方法那么他将不会出现这种线程不安全的情况,而是两对象一个一个按顺序的进入这个同步的方法里,

出现这中情况,只能说明他是对象同步的。

所以说这段代码意思是我创建了两个对象,同时我也创建了两把对象锁来同步话各自的run方法,只不过每一条线程的调用顺序不同才会出现这样的结果。

总结:synchronized关键字同步的是对象不是方法

最新文章

  1. Android WebView 302斗争之旅
  2. 关于安装ruby brew 提示失败
  3. javaweb局部刷新-ajax异步请求springMVC显示返回的jsp内容,代替iframe
  4. Arcgis报错: Bad login user Failed to execute (CreateEnterpriseGeodatabase).
  5. swap chain- IDirect3DSwapChain9
  6. 【POJ3580】【块状链表】SuperMemo
  7. 模型 Model
  8. C#高级编程三十天----泛型结构,泛型方法,泛型托付
  9. ognl--数据运转的催化剂
  10. 实验用rootkit
  11. WPF开发进阶 - Fody/PropertyChanged(二)
  12. 关于pipelineDB调用GetLocalStreamReaders的BUG
  13. Oracle:控制语句 IF..ELSIF语句、CASE语句、FOR循环语句
  14. Struts2实现文件上传(四)
  15. 06、NetCore2.0依赖注入(DI)之整合Autofac
  16. 3d轮播图(另一种方式,可以实现的功能更为强大也更为灵活,简单一句话,比酷狗优酷的炫)
  17. Python开发——12.socket编程
  18. python提取文件中的方法名称
  19. 中国历史人物传记数据库 CBDB 若干表简介
  20. crm --- 1.admin , 展示列表 和 分页

热门文章

  1. Html h1-h6 标签
  2. Windows SubSystem for Linux
  3. #map+LCA# Codeforces Round #362 (Div. 2)-C. Lorenzo Von Matterhorn
  4. css的再深入8(更新中···)
  5. Static需谨慎
  6. mui框架下监听返回按钮
  7. spring 事务的七中传播行为五中隔离
  8. spring 集成 mybatis
  9. less点滴
  10. 【转】Angular学习总结--很详细的教程