Synchronized(this) 锁住该代码块的对象,等访问该对象的线程执行完,其他线程才可以执行。 Synchronized(xxx.class) 锁住该类,所有访问该类的线程,一次只有一个可以执行。 其他 A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。 B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。 C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制 package kafka.producer //kafka默认的分区 进行msg的keyhash分区 import kafka.utils._ import org.apache.kafka.common.utils.Utils @deprecated("This class has been deprecated and will be removed in a future release. " + "It has been replaced by org.apache.kafka.clients.producer.internals.DefaultPartitioner.", "0.10.0.0") class DefaultPartitioner(props: VerifiableProperties = null) extends Partitioner { private val random = new java.util.Random def partition(key: Any, numPartitions: Int): Int = { Utils.abs(key.hashCode) % numPartitions } } kafka的自定义分区 import kafka.producer.Partitioner; import kafka.utils.VerifiableProperties; public class KafkaPartitioner implements Partitioner{ public KafkaPartitioner(VerifiableProperties properties) { } @Override public int partition(Object obj, int numPartitions) { int partition = 0; if (obj instanceof String) { String key=(String)obj; int offset = key.lastIndexOf('.'); if (offset > 0) { partition = Integer.parseInt(key.substring(offset + 1)) % numPartitions; } }else{ partition = obj.toString().length() % numPartitions; } return partition; } }