同步锁 --1,概述 锁是指 把共享资源 锁住 同步是指 其他线程 排队等待钥匙的现象 专门用来解决 多线程 中共享数据有隐患的问题 使用synchronized关键字表示锁 在多线程编程里, 有多条语句操作 了 共享资源 ,一定会有隐患!!! --2,用法 --用在方法上/同步方法 synchronized public void eat(){} --用在代码块上/同步代码块 synchronized(锁对象){.......} --3,改造售票代码 --implements Runnable
测试
public class C2 {
public static void main(String[] args) {
Ticket target = new Ticket();
Thread t = new Thread(target);
Thread t2 = new Thread(target);
Thread t3 = new Thread(target);
Thread t4 = new Thread(target);
t.start();
t2.start();
t3.start();
t4.start();
}
}
class Ticket implements Runnable{
int ticket = 100;
Object o = new Object();
String s ="13";
@Override
//TODO 1,现在由于多线程 中,,对于共享资源进行了抢的操作,所以共享资源不安全
//可以使用锁 来保证安全,但是牺牲性能.synchronized表示锁
//锁可以用在方法上也可以用在代码块上.
//同步方法 synchronized public void run() {
//同步代码块 -- synchronized(锁对象){有问题代码}
public void run() {
while (true){
//TODO 2,同步代码块:需要考虑两个问题
//1,锁的位置(合理位置,从开始用到用完结束) 2,锁对象(可以任务,但必须是同一个对象)
//synchronized(new Object()){//四个线程new了4把锁,不是同一个锁对象,错的
//synchronized(o){//同一个锁对象,OK
//synchronized(s){//同一个锁对象,OK
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "--" + ticket--);
} else {
break;
}
}
}
}
}
原文:https://www.cnblogs.com/liang-shi/p/13887141.html