线程安全synchronized
package thread;
/**
* 线程安全:300个人拧200个螺丝
* synchronized:关键字 同步锁
* 1)修饰代码块:同步语句块 作用对象:调用同步语句块的对象
* 2)修饰方法:同步方法 作用对象:调用同步方法的对象
* 3)修饰静态方法: 作用对象:这个类的所有对象
* 4)修饰类:作用对象:这个类的所有对象
*
* 当两个并发线程(thread1和thread2)访问同一个对象(runnable)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,
* 另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。
* Thread1和thread2是互斥的,因为在执行synchronized代码块时会锁定当前的对象,
* 只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。
*/
public class MyRunnable implements Runnable {
private int luosi = 200;
@Override
public synchronized void run() {
for(int i =1 ;i<=100;i++){
// 100个人拧螺丝
if (luosi >0){
try {
// 每个人需要耗费50毫秒拧螺丝
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
luosi -= 1;
System.out.println(Thread.currentThread().getName()+"拧了螺丝,还剩:"+luosi+"个没拧");
}
}
}
}
class MyRunnableDemo{
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
// 第一个地方100个人拧
Thread thread1 = new Thread(runnable);
// 第二个地方100个人拧
Thread thread2 = new Thread(runnable);
// 第三个地方100个人拧
Thread thread3 = new Thread(runnable);
thread1.start();
thread2.start();
thread3.start();
}
}