对关键字synchronized的使用心得

1.今天看了一下synchronized的使用方法。在此进行总结

(1)synchronized修饰代码块,代码示例如下:

对关键字synchronized的使用心得_第1张图片

我最开始只建了两个线程,程序在运行的时候发现和join()方法运行的结果没有什么差异性,请对比一下我这两段代码。输出结果一致的。我就思考synchronized和join的区别,没有看出来。我尝试多建了一个线程,结果一目了然。这两个方法区别很明显:join可以按照指定的线程顺序输出结果。但是synchronized就不是这样了,三个线程的时候,每一个线程都会抢占cpu资源,当某一个线程抢占到之后,synchronized修饰的线程就不允许其他线程再去访问。这个顺序是没有保证的。和join方法相比,虽然打印的结果一样,但是线程输出的顺序缺不一样。这里不再赘述,大家可以打印线程的name观察即可对比。

对关键字synchronized的使用心得_第2张图片

当两个并发线程(thread1和thread2)访问同一个对象(syncThread)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。Thread1和thread2是互斥的,因为在执行synchronized代码块时会锁定当前的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。 

我们再把SyncThread的调用稍微改一下:

Thread thread1 = new Thread(new SyncThread(), "SyncThread1");

Thread thread2 = new Thread(new SyncThread(), "SyncThread2");

thread1.start();

thread2.start();

此时结果就是交替执行,为什么呢?不是说加锁呢,怎么还会交替执行?

因为synchronized只锁定对象,每个对象只有一个锁(lock)与之相关联

上面这段代码就等同于

SyncThread syncThread1 = new SyncThread();

SyncThread syncThread2 = new SyncThread();

Thread thread1 = new Thread(syncThread1, "SyncThread1");

Thread thread2 = new Thread(syncThread2, "SyncThread2");

thread1.start();

thread2.start();

这时创建了两个SyncThread的对象syncThread1和syncThread2,线程thread1执行的是syncThread1对象中的synchronized代码(run),而线程thread2执行的是syncThread2对象中的synchronized代码(run);我们知道synchronized锁定的是对象,这时会有两把锁分别锁定syncThread1对象和syncThread2对象,而这两把锁是互不干扰的,不形成互斥,所以两个线程可以同时执行。Java中Synchronized的用法 - CSDN博客

你可能感兴趣的:(对关键字synchronized的使用心得)