synchronized的作用:同一个时刻最多只有一个线程执行该代码,以达到保证并发安全的效果。
synchronized的用法:对象锁(默认锁对象为this当前实例对象),同步代码块锁(自己指定锁对象)
类锁:synchronized修饰静态的方法以及指定锁为class对象
1.同步代码块锁:
package com.zx.synchronize;
/**
* 对象锁 代码块形式
* @author Administrator
*
*/
public class SynchronizeBlock01 implements Runnable {
static SynchronizeBlock01 instance=new SynchronizeBlock01();
Object lock1=new Object();
Object lock2=new Object();
@Override
public void run() {
synchronized (lock1) {
System.out.println("我是lock1,我叫"+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"lock1部分运行结束");
}
synchronized (lock2) {
System.out.println("我是lock2,我叫"+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"lock2部分运行结束");
}
}
public static void main(String[] args) {
Thread t1=new Thread(instance);
Thread t2=new Thread(instance);
t1.start();
t2.start();
while (t1.isAlive() || t2.isAlive()) {
}
System.out.println("finished");
}
}
打印结果:
我是lock1,我叫Thread-0
Thread-0lock1部分运行结束
我是lock2,我叫Thread-0
我是lock1,我叫Thread-1
Thread-0lock2部分运行结束
Thread-1lock1部分运行结束
我是lock2,我叫Thread-1
Thread-1lock2部分运行结束
finished
2.方法锁:
package com.zx.synchronize;
/**
* 对象锁 方法锁
* @author Administrator
*
*/
public class SynchronizedBlock02 implements Runnable {
static SynchronizedBlock02 instance=new SynchronizedBlock02();
@Override
public void run() {
block();
}
public static void main(String[] args) {
Thread t1=new Thread(instance);
Thread t2=new Thread(instance);
t1.start();
t2.start();
while (t1.isAlive() || t2.isAlive()) {
}
System.out.println("finished");
}
public synchronized void block() {
System.out.println("我的对象锁的方法修饰符形式,我叫"+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"运行结束");
}
}
打印结果:
我的对象锁的方法修饰符形式,我叫Thread-0
Thread-0运行结束
我的对象锁的方法修饰符形式,我叫Thread-1
Thread-1运行结束
finished
3.类锁的static方法:
package com.zx.synchronizeclass;
/**
* 类锁的第一种形式:static形式
* @author Administrator
*
*/
public class SynchronizedClassStatic implements Runnable{
static SynchronizedClassStatic instance1=new SynchronizedClassStatic();
static SynchronizedClassStatic instance2=new SynchronizedClassStatic();
public static void main(String[] args) {
Thread t1=new Thread(instance1);
Thread t2=new Thread(instance2);
t1.start();
t2.start();
while (t1.isAlive() || t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
block();
}
public static synchronized void block() {
System.out.println("我的类锁的第一种形式:static形式,我叫"+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"运行结束");
}
}
打印结果:
我的类锁的第一种形式:static形式,我叫Thread-1
Thread-1运行结束
我的类锁的第一种形式:static形式,我叫Thread-0
Thread-0运行结束
finished
4.类锁:synchronized(*.class)
package com.zx.synchronizeclass;
/**
* 类锁的第二种形式:synchronized(*.class)
* @author Administrator
*
*/
public class SynchronizedClassClass implements Runnable{
static SynchronizedClassClass instance1=new SynchronizedClassClass();
static SynchronizedClassClass instance2=new SynchronizedClassClass();
public static void main(String[] args) {
Thread t1=new Thread(instance1);
Thread t2=new Thread(instance2);
t1.start();
t2.start();
while (t1.isAlive() || t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
method();
}
private void method() {
synchronized (SynchronizedClassStatic.class) {
System.out.println("我的类锁的第二种形式:synchronized(*.class),我叫"+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"运行结束");
}
}
}
打印结果:
我的类锁的第二种形式:synchronized(*.class),我叫Thread-0
Thread-0运行结束
我的类锁的第二种形式:synchronized(*.class),我叫Thread-1
Thread-1运行结束
finished