java同步锁的正确使⽤⽅法(必看篇)同步锁分类
对象锁(this)
类锁(类的字节码⽂件对象即类名.class)
字符串锁(⽐较特别)
应⽤场景
在多线程下对共享资源的安全操作。
需求:启动5个线程对共享资源total进⾏安全操作。
同步锁在多线程单例模式下的使⽤
以上三类同步锁都可以。
Thread;
public class MyThread implements Runnable {
private static int total = 10;
@Override
public void run() {
synchronized (this){ //使⽤this对象锁
//synchronized (MyThread.class){ //使⽤MyThread.class类锁
//synchronized (""){//使⽤字符串锁
System.out.println(Thread.currentThread().getName() + "正在运⾏");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println(total);
System.out.println(Thread.currentThread().getName() + "线程结束");
}
}
}
st;
Thread.MyThread;
public class TestMyThread {
public static void main(String[] args){
MyThread myThread = new MyThread();
Thread thread = null;
for (int i = 1 ; i <= 5 ; i++){
thread = new Thread(myThread,"线程"+i); //开启5个线程,传⼊同⼀个对象
thread.start();
}
}
}
线程1正在运⾏
9
线程1线程结束
线程3正在运⾏
try catch的使用方法8
线程3线程结束
线程5正在运⾏
7
线程5线程结束
线程2正在运⾏
6
线程2线程结束
线程4正在运⾏
5
线程4线程结束
分析:从运⾏结果可以看出5个线程串⾏执⾏同步锁⾥⾯的代码,因为5个线程中的同步锁对象this指向同⼀个的对象(同步锁对象MyThread.class类锁是同⼀个对象、同步锁对象 ”” 字符串锁是同⼀个对象),所以5个线程会串⾏执⾏同步锁⾥⾯的代码。
同步锁在多线程多例模式下的使⽤
错误⽤法
Thread;
public class MyThread implements Runnable {
private static int total = 10;
@Override
public void run() {
synchronized (this){//使⽤this对象锁
System.out.println(Thread.currentThread().getName() + "正在运⾏");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println(total);
System.out.println(Thread.currentThread().getName() + "线程结束");
}
}
}
st;
Thread.MyThread;
public class TestMyThread {
public static void main(String[] args){
Thread thread = null;
for (int i = 1 ; i <= 5 ; i++){
thread = new Thread(new MyThread(),"线程"+i);//开启5个线程,传⼊5个不同对象
thread.start();
}
}
}
线程2正在运⾏
线程1正在运⾏
线程3正在运⾏
线程5正在运⾏
线程4正在运⾏
9
7
9
8
线程1线程结束
线程5线程结束
线程2线程结束
线程3线程结束
6
线程4线程结束
分析:从运⾏结果可以看出5个线程并⾏执⾏同步锁⾥⾯的代码,因为5个线程中的同步锁对象this指向5个不同的对象,所以5个线程会同时执⾏同步锁⾥⾯的代码。
正确⽤法
⽅式⼀:
Thread;
public class MyThread implements Runnable {
private static int total = 10;
@Override
public void run() {
synchronized (MyThread.class){//使⽤MyThread.class类锁
System.out.println(Thread.currentThread().getName() + "正在运⾏");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println(total);
System.out.println(Thread.currentThread().getName() + "线程结束");
}
}
}
st;
Thread.MyThread;
public class TestMyThread {
public static void main(String[] args){
Thread thread = null;
for (int i = 1 ; i <= 5 ; i++){
thread = new Thread(new MyThread(),"线程"+i); //开启5个线程,传⼊5个不同对象
thread.start();
}
}
}
线程1正在运⾏
9
线程1线程结束
线程5正在运⾏
8
线程5线程结束
线程4正在运⾏
7
线程4线程结束
线程3正在运⾏
6
线程3线程结束
线程2正在运⾏
5
线程2线程结束
分析:从运⾏结果可以看出5个线程串⾏执⾏同步锁⾥⾯的代码,因为5个线程中的同步锁对象MyThread.class类锁是同⼀个对象,所以5个线程会串⾏执⾏同步锁⾥⾯的代码。
⽅式⼆:
Thread;
public class MyThread implements Runnable {
private static int total = 10;
@Override
public void run() {
synchronized (""){//使⽤字符串锁
System.out.println(Thread.currentThread().getName() + "正在运⾏");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println(total);
System.out.println(Thread.currentThread().getName() + "线程结束");
}
}
}
st;
Thread.MyThread;
public class TestMyThread {
public static void main(String[] args){
Thread thread = null;
for (int i = 1 ; i <= 5 ; i++){
thread = new Thread(new MyThread(),"线程"+i); //开启5个线程,传⼊5个不同对象
thread.start();
}
}
}
线程1正在运⾏
9
线程1线程结束
线程4正在运⾏
8
线程4线程结束
线程5正在运⾏
7
线程5线程结束
线程3正在运⾏
6
线程3线程结束
线程2正在运⾏
5
线程2线程结束
分析:从运⾏结果可以看出5个线程串⾏执⾏同步锁⾥⾯的代码,因为5个线程中的同步锁对象 ”” 字符串锁是同⼀个对象,所以5个线程会串⾏执⾏同步锁⾥⾯的代码。
以上这篇java同步锁的正确使⽤⽅法(必看篇)就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。