1.什么的synchronize
今天学习了java的关键字synchronized关键字synchronized作为java的关键字,可以说是元老级的存在,我们必须去学。
synchronized 翻译过来是同步的。在java官方解释的是:支持一种简单的策略防止线程干扰和内存一致性的错误。
- 通俗易懂点讲就是:保证了同一时刻最多有一个线程执行该代码,以此来达到线程安全
我们新建两个线程来然后输出来看线程的运行情况
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");
}
@Override
public void run() {
System.out.println("我是对象锁的代码块形式。我叫" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"运行结束");
}
-
运行结果
我们使用关键字synchronized
public void run() {
synchronized(this) {
System.out.println("我是对象锁的代码块形式。我叫" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"运行结束");
}
}
运行结果
很明显,使用关键字后两个线程有序进行,当第一个线程结束 第二个线程才开始
2.Synchronized的用法
- 对象锁
- 同步代码块锁
- 方法锁
- 类锁
- 用synchronized修饰static 方法
- 修饰(*.class)的代码块
1.对象锁--同步代码块锁
默认是this,也可以更换成
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() {
synchronized(this) {
doSomething();
}
}
2.对象锁--方法锁
@Override
public void run() {
method();
}
public synchronized void method(){
doSomething()
}
3.类锁--用synchronized修饰static 方法
@Override
public void run() {
method();
}
public static synchronized void method(){
System.out.println("我是类锁第一种形式:static形式,我叫" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName() + "运行结束");
}
4.类锁--修饰(*.class)的代码块
@Override
public void run() {
method();
}
public static synchronized void method(){
synchronized (SynchronizedClassClass5.class) {
System.out.println("我是类锁第二种形式:代码块形式,我叫" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName() + "运行结束");
}
}
网友评论