Open Moosphan opened 5 years ago
多线程同步跟异步这不是两种事物吗,不是应该线程池跟线程锁吗
我了解到的, 大概是这样的几种方式:
@Ssuiyingsen 回答的, 和这个问题, 有点偏离, 不建议这样回答(重点在于解决同步问题, 不是怎么跑起来多个线程);
线程同步: 1、wait/notify 2、加锁,reentrantLock 以及读写锁 3、synchronized关键字(本质也是加锁) 4、cas
多线程同步和异步不是一回事。 几种情况, 1.就是大家说的synchronized 他可以保证原子性,保证多个线程在操作同一方法时只有一个线程可以持有锁,并且操作该方法, 2.就是手动调用读写锁, 3.手动操作线程的wait和notify
线程间的同步实质是保证相城中共享变量的数据同步
可以用 synchronized 关键词 作用在代码块上 或者静态非静态方法都可以。 或者 wait/notifyAll。 参数可以加入 volatile参数 让其做到 内存可见性。
多线程同步和异步不是一回事。 几种情况, 1.就是大家说的synchronized 他可以保证原子性,保证多个线程在操作同一方法时只有一个线程可以持有锁,并且操作该方法, 2.就是手动调用读写锁, 3.手动操作线程的wait和notify
- volatile我记得是没有原子性的,他可以保证内存可见性,在多线程的情况下保证每个线程的数据都是最新的
volitile主要是在CPU指令禁止重排和多线程访问变量时变量发生变化时,各线程的值是同时变化的。
更多的情况下,如果仅仅是一个变量的同步性,我喜欢原子类AtomicInteger AtomicBoolean等等,这样写还简单
thread.join也算吗
多线程下的线程同步,保证代码在多线程下实现 原子性 可见性 有序性 1、volatile 确保了可见性、有序性,但不能保证原子性 对于++这种操作就不能保证同步 2、synchronized 保证了可见性 有序性和原子性
1.继承Thread类,重写run函数方法 2.实现Runnable接口,重写run函数方法 3.实现Callable接口,重写call函数方法 4.HandlerThread 5.AsyncTask很老的一种= = 6.Synchronized 同步
只有6是正确的,其他都是如何异步
1.继承线程类,重构运行函数方法 2.实现Runnable接口,重构运行函数方法 3.实现Callable接口,调用调用函数方法 4.HandlerThread 5.AsyncTask很老的一种= = 6.同步同步
占坑
Java里面进行多线程通讯的主要方式就是共享内存的方式,共享内存主要关注的点有两个:可见和有序原子性。Java的内存模型解决了可见性和有序性的问题,而锁解决的是原子性的问题。理想情况下我们希望做到"同步"和"互斥"。主要通过以下几种方式:
如果需要进行多个线程之间进行通信,则使用同步机制; 如果需要隔离多个线程之间的共享冲突,可以使用threadLocal。这会极大的简化程序,使程序更加易读、简洁
NO 知啊