synchronized的初级用法

同步代码块

//	创建Runnable实现类
public class Ticket implements Runnable {
	private int count = 100;

	@Override
	public void run() {
		while (true) {
			//	每次只允许一个线程访问,然后上锁
			synchronized (this) {
				if (count > 0) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "正在卖第'" + count-- + "'张票");
				}
			}
		}
	}
}

//	测试
public class Sample {
	public static void main(String[] args) {
		Ticket ticket = new Ticket();
		Thread t1 = new Thread(ticket, "t1");
		Thread t2 = new Thread(ticket, "t2");
		Thread t3 = new Thread(ticket, "t3");
		t1.start();
		t2.start();
		t3.start();
	}
}
//	测试结果实现了同步锁

同步方法

//	创建Runnable实现类
public class Ticket implements Runnable {
	private count = 100;

	@Override
	public void run() {
		while (true) {
			sell();
		}
	}

	//	非静态方法同步锁是this,也就是实例
	//	静态方法同步锁是类对象,也就是类名.class
	public synchronized void sell() {
		if (count > 0) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "正在卖第'" + count-- + "'张票");
		}
	}
}

//	测试
public class Sample {
	public static void main(String[] args) {
		Ticket ticket = new Ticket();
		Thread t1 = new Thread(ticket, "t1");
		Thread t2 = new Thread(ticket, "t2");
		Thread t3 = new Thread(ticket, "t3");
		t1.start();
		t2.start();
		t3.start();
	}
}
//	测试结果实现了同步锁

使用Lock方法

//	创建Runnable实现类
public class Ticket implements Runnable {
	private int count = 100;

	//	创建lock对象
	Lock lock = new ReentrantLock();

	@Override
	public void run() {
		while (true) {
			//	加锁
			lock.lock();
				if (count > 0) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "正在卖第'" + count-- + "'张票");
				}
			//	释放锁
			lock.unlock();
		}
	}
}

//	测试
public class Sample {
	public static void main(String[] args) {
		Ticket ticket = new Ticket();
		Thread t1 = new Thread(ticket, "t1");
		Thread t2 = new Thread(ticket, "t2");
		Thread t3 = new Thread(ticket, "t3");
		t1.start();
		t2.start();
		t3.start();
	}
}
//	测试结果实现了同步锁
Java中的初级并发问题主要涉及多线程编程。下面是一些常见的初级并发问题及其解决方法: 1. 竞态条件(Race Condition):当多个线程同时访问和修改共享数据时,可能导致意外的结果。解决方法包括使用锁(synchronized关键字或ReentrantLock类)来保护共享数据的访问,或者使用线程安全的数据结构。 2. 死锁(Deadlock):当多个线程互相等待对方释放资源时,导致程序无法继续执行。为避免死锁,可以使用避免循环等待、按顺序获取锁、设置超时时间等策略。 3. 内存可见性(Memory Visibility):当一个线程修改了共享变量的值,其他线程可能无法立即看到最新的值。可以使用volatile关键字来保证变量的可见性,或者使用synchronized关键字或Lock对象来确保线程间的通信。 4. 并发集合的安全性:Java提供了一些线程安全的集合类,如ConcurrentHashMap和CopyOnWriteArrayList。使用这些类可以在多线程环境下安全地进行集合操作。 5. 线程调度与同步:在多线程编程中,需要合理地控制线程的调度和同步。可以使用wait()和notify()等方法实现线程之间的等待和通知机制,或者使用CountDownLatch和CyclicBarrier等同步工具类。 需要注意的是,并发编程是一项复杂的任务,需要谨慎处理。合理地设计和管理线程,以及正确地使用同步机制,能够提高程序的并发性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值