Java多线程的同步问题
本文最后更新于:1 年前
1 - synchronized关键字对代码块的同步
public class ThreadSynchronization {
public static void main(String[] args) {
TestThread t = new TestThread();
// 启动四个线程,并实现资源共享
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TestThread implements Runnable{
private int tickets = 5;
@Override
public void run(){
while (true) {
// 利用synchronized关键字对这一代码块进行同步,避免共享资源的随意访问
synchronized (this) {
if (tickets <= 0) break;
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "出售票" + tickets);
tickets -= 1;
}
}
}
}
2 - synchronized关键字对方法的同步
public class ThreadSynchronization {
public static void main(String[] args) {
TestThread t = new TestThread();
// 启动四个线程,并实现资源共享
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TestThread implements Runnable{
private int tickets = 5;
@Override
public void run(){
while (tickets > 0){
sale();
}
}
// 利用synchronized关键字对这本方法进行同步,避免共享资源的随意访问
public synchronized void sale() {
if (tickets > 0) {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "出售票" + tickets);
tickets -= 1;
}
}
}
3 - 在Java中,synchronized方法在同一时刻只能被一个线程调用,因此性能很差,从JDK1.5开始Java的API中引入了另一个锁的机制,这种锁机制包含在java.util.concurrent.locks包中
4 - 当系统中出现不同的读、写线程同时访问某一资源时,需要考虑共享互斥问题,可使用 synchronized 解决问题。若对性能要求较高的情况下,可考虑使用 ReadWriteLock 接口及其 ReentrantReadWriteLock 实现类。此外,为了在高并发情况下获取较高的吞吐率,建议使用 Lock 接口及其 ReentrantLock 实现类来替换以前的 synchronized 方法或代码块
以上, 3-4段内容,均引自<<Java从入门到精通(第二版)>> 张玉宏主编
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!