一.运用synchronized关键字安全
首先咱们来看看一个多线程中线程不安全的列子多线程
代码以下:ide
共享数据类:测试
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(); } } }
线程测试类:spa
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后结果就会同步了,结果以下:code
那么,在这里是对这个run方法进行了同步呢?仍是对这个对象进行了同步呢?对象
二.synchronized同步的是对象blog
为了证实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关键字同步的是对象不是方法