java-Synchronized 一种同步锁:
package com.company;
import java.util.Vector;
/**
* synchronized 是一种同步锁
*
* 修饰一个代码块
* 1、一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞。
*/
public class SynchronizedThread extends Thread {
public static int count = 0;
public synchronized void run(){
for (int i = 0; i < 5; i++) {
try {
System.out.println("线程名:" + Thread.currentThread().getName()+ " :" + (count++));
// Thread.sleep(100);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
package com.company;
/**
* Synchronzie 关键之的使用
*/
public class SynchronizedMain {
public static void main(String[] args) {
/**
* 当两个并发线程(thread1和thread2)访问同一个对象(synchronize)中的synchronized代码块时,
* 在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块
* 以后才能执行该代码块。Thread1和thread2是互斥的,因为在执行synchronize 代码块时会锁定当前
* 的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。
*/
Thread thread1 = new Thread(new SynchronizedThread(), "t1");
Thread thread2 = new Thread(new SynchronizedThread(), "t2");
thread1.start();
thread2.start();
/**
* thread1和thread2同时在执行。这是因为synchronized只锁定对象,每个对象只有一个锁(lock)与之相关联;
* 这时创建了两个 这时创建了两个SyncThread的对象syncThread1和syncThread2,
* 线程thread1 执行的是syncThread1 对象中的synchronized代码(run)
* 线程thread2 执行的是syncThread2 对象中的synchronized代码(run)
*
* 我们知道synchronized锁定的是对象,这时会有两把锁分别锁定syncThread1对象和syncThread2对象,
* 而这两把锁是互不干扰的,不形成互斥,所以两个线程可以同时执行。
*/
// SynchronizedThread synchronize1 = new SynchronizedThread();
// SynchronizedThread synchronize2 = new SynchronizedThread();
// Thread thread1 = new Thread(synchronize1, "synchronize1");
// Thread thread2 = new Thread(synchronize2, "synchronize2");
// thread1.start();
// thread2.start();
}
}